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

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

网管是不是应该要有 CCIE 证书啥的。
morphyhu
2020-06-16 10:18:08 +08:00
这个帖子拉低了 V2EX 的逼格。
mitu9527
2020-06-16 10:18:18 +08:00
不是我们高傲,而是我们希望你能自己解决这个问题,对我们有尊重,对你自己也有好处。这种问题你自己稍微查一下再试一下就能搞定,没必要跑来提问,对你来说是节省了时间,对别人来说呢?这种把别人当工具的提问方式,不只是程序员,相信其他人也不会觉得舒服。
CismonX
2020-06-16 10:26:23 +08:00
这个长度应该为 inet_ntop() 的 buffer 大小减去 1,即 INET6_ADDRSTRLEN - 1 = 45 字节。举例:ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
ylsc633
2020-06-16 10:30:10 +08:00
如果不清楚的人估计第一反应都是用 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
2020-06-16 10:33:57 +08:00
补充一下( lz 说的是放进“数据库”,并没有指明是什么数据库):

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

PG 扩展的数据类型是选用它一个很重要的原因之一
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
2020-06-16 10:38:16 +08:00
@GeruzoniAnsasu (偷偷提醒一下,帖子的分类)
GeruzoniAnsasu
2020-06-16 10:41:09 +08:00
@msg7086 是我瞎了不好意思
fxxkgw
2020-06-16 10:52:00 +08:00
官方推荐用 varbinary(16) 这个兼容 IPV4 IPV6

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

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

上面这 4 个函数是兼容 IPV4 IPV6 的,貌似对 mysql 版本有要求(忘记具体哪个版本了),不过一般只要不是太老肯定都支持的。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX