V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
frozenway
V2EX  ›  MySQL

IPV6 地址是多少位的,想储存到数据库里面, varchar(30)可以吗?

  •  
  •   frozenway · 2020-06-16 09:40:32 +08:00 · 9015 次点击
    这是一个创建于 1625 天前的主题,其中的信息可能已经有所发展或是发生改变。
    33 条回复    2020-10-26 09:08:24 +08:00
    frozenway
        1
    frozenway  
    OP
       2020-06-16 09:43:02 +08:00
    我的意思是想问 IPV6 字符长度是多少
    picone
        2
    picone  
       2020-06-16 09:44:43 +08:00
    IPv6 地址是 128bit,相当于 16 个 char 就够了,你可以存 blob 。当然读写都得转换一下。
    liuser666
        4
    liuser666  
       2020-06-16 09:47:52 +08:00
    不会吧?现在程序员连 ipv6 多少位都不知道了? 128 位,16 字节。你要是想作为字符串存还得考虑里面的冒号以及简便写法。
    frozenway
        5
    frozenway  
    OP
       2020-06-16 09:53:06 +08:00
    @liuser666 我不是程序员,我是网管
    littleylv
        6
    littleylv  
       2020-06-16 09:55:26 +08:00   ❤️ 7
    V 站问题质量越来越低,百度一下 1 分钟可以知道答案的问题都能问了。
    zhuweiyou
        7
    zhuweiyou  
       2020-06-16 09:57:15 +08:00
    我以为我进了贴吧
    frozenway
        8
    frozenway  
    OP
       2020-06-16 10:02:27 +08:00
    @littleylv @zhuweiyou 大佬,你觉得简单的问题不能问?这也太欺负人了
    chenyu0532
        9
    chenyu0532  
       2020-06-16 10:04:56 +08:00
    @frozenway 楼上也不是这个意思。。只是这种 baidu 有的问题就直接 baidu 了。。在这发帖子浪费时间
    dayFvckingByte
        10
    dayFvckingByte  
       2020-06-16 10:07:44 +08:00   ❤️ 11
    @frozenway 我觉得你用发这帖子的时间一个一个数都能数出来了😂
    Kilerd
        11
    Kilerd  
       2020-06-16 10:15:14 +08:00   ❤️ 5
    网管不是应该对这个玩意儿更加熟悉吗?

    网管是不是应该要有 CCIE 证书啥的。
    morphyhu
        12
    morphyhu  
       2020-06-16 10:18:08 +08:00
    这个帖子拉低了 V2EX 的逼格。
    mitu9527
        13
    mitu9527  
       2020-06-16 10:18:18 +08:00   ❤️ 19
    不是我们高傲,而是我们希望你能自己解决这个问题,对我们有尊重,对你自己也有好处。这种问题你自己稍微查一下再试一下就能搞定,没必要跑来提问,对你来说是节省了时间,对别人来说呢?这种把别人当工具的提问方式,不只是程序员,相信其他人也不会觉得舒服。
    CismonX
        14
    CismonX  
       2020-06-16 10:26:23 +08:00 via iPhone   ❤️ 2
    这个长度应该为 inet_ntop() 的 buffer 大小减去 1,即 INET6_ADDRSTRLEN - 1 = 45 字节。举例:ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
    ylsc633
        15
    ylsc633  
       2020-06-16 10:30:10 +08:00   ❤️ 2
    如果不清楚的人估计第一反应都是用 varchar 来存! 方便直观

    不过在 MySQL 高性能这本书里推荐的是(unsigned int) 来存储,相比字符串:
    1. 节省空间,不管是数据存储空间还是索引存储空间
    2. 便于使用范围查询,且效率快
    3. 就是在数据库里直观看,不是很方便

    IPv4 用 inet_aton 来将 IP 转成 int,用 inet_ntoa 将 int 转回 IP
    IPv6 用 inet6_aton 来将 IP 转成 INT,用 inet6_ntoa 将 int 转回 IP
    GeruzoniAnsasu
        16
    GeruzoniAnsasu  
       2020-06-16 10:33:57 +08:00   ❤️ 2
    补充一下( lz 说的是放进“数据库”,并没有指明是什么数据库):

    https://www.postgresql.org/docs/9.1/datatype-net-types.html

    PG 扩展的数据类型是选用它一个很重要的原因之一
    msg7086
        17
    msg7086  
       2020-06-16 10:37:39 +08:00
    首先,如果是存数据库,为什么要特意限制 varchar 的长度?
    255 字节内的存储成本都是一样的,直接设 varchar(255) ascii 不就行了?

    然后 IP 地址存数据库,当然是 VARBINARY(16)咯。
    官网找 IPv6 就有全套说明:
    https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_inet6-aton
    msg7086
        18
    msg7086  
       2020-06-16 10:38:16 +08:00
    @GeruzoniAnsasu (偷偷提醒一下,帖子的分类)
    GeruzoniAnsasu
        19
    GeruzoniAnsasu  
       2020-06-16 10:41:09 +08:00
    @msg7086 是我瞎了不好意思
    fxxkgw
        20
    fxxkgw  
       2020-06-16 10:52:00 +08:00   ❤️ 3
    官方推荐用 varbinary(16) 这个兼容 IPV4 IPV6

    每次存储前都需要使用 INET6_ATON("ipv4")、INET6_ATON("ipv6")转化为字节码后存储

    获取时都需要用 INET6_NTOA("ipv4")、INET6_NTOA("ipv6")转化为字符串

    上面这 4 个函数是兼容 IPV4 IPV6 的,貌似对 mysql 版本有要求(忘记具体哪个版本了),不过一般只要不是太老肯定都支持的。。
    frozenway
        21
    frozenway  
    OP
       2020-06-16 11:24:24 +08:00
    @CismonX 百度说是 46 字节
    @ylsc633 照你这么说,凡是 varchar 的字段直接设成 255 长度和设置成 1 ~ 255 之间的长度没什么区别吗?
    xnode
        22
    xnode  
       2020-06-16 11:29:36 +08:00
    varchar(255)的意思不是最大 255? 小于 255 用多少占多少? char 才是固定长度吧
    uricc
        23
    uricc  
       2020-06-16 12:32:32 +08:00 via iPhone
    IPv6 的小鸡不都是免费褥么,参考德国 euserv
    zy445566
        24
    zy445566  
       2020-06-16 14:30:06 +08:00
    字符串最长 39 位如下:
    ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    字符串最短 4 位如下:
    0::0
    zy445566
        25
    zy445566  
       2020-06-16 14:38:52 +08:00 via Android
    @zy445566
    打自己的脸,最短 2 位如下(和 0::0 一个意思):
    ::
    CodeCodeStudy
        26
    CodeCodeStudy  
       2020-06-16 16:52:18 +08:00
    @msg7086 varchar 的长度还是有影响的,在关联查询的时候会生成临时表,长度越大,临时表越大。
    https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html 找到
    VARCHAR and VARBINARY column values are padded to the maximum column length, in effect storing them as CHAR and BINARY columns.
    msg7086
        27
    msg7086  
       2020-06-16 17:00:13 +08:00
    @CodeCodeStudy
    是,关联查询会不一样,但是都已经在字符串上关联了,临时表大小可能已经是小问题了……
    realpg
        28
    realpg  
       2020-06-16 17:20:23 +08:00
    用 varchar 存 既然都是 var 了 直接给个 200 够了……
    ChanKc
        29
    ChanKc  
       2020-06-16 19:11:57 +08:00 via Android
    今天的 leetcode explore 的题你定的?(笑
    prenwang
        30
    prenwang  
       2020-06-16 22:29:22 +08:00
    屁, 有啥不能问的, 质量不好的帖子自然会沉下去, 你觉得未提质量低不回复直接忽略就是, 这社区有一套适合每个人的过滤机制, 总有人把自己当卫道士一样. 恶心, 恶心,恶心
    lekai63
        31
    lekai63  
       2020-06-16 22:33:48 +08:00 via iPhone
    换我就直接用 pgSQL 存 ip 类型
    frozenway
        32
    frozenway  
    OP
       2020-06-17 09:34:53 +08:00
    @prenwang 就是
    6orz
        33
    6orz  
       2020-10-26 09:08:24 +08:00
    人家只是问 varchar 多少存一下,回复这么多没用的,楼主你设置 varchar ( 30 )就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:20 · PVG 18:20 · LAX 02:20 · JFK 05:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.