在MySQL数据库中将IPv4,IPv6地址存储为字符串应该是理想的大小。 varchar(32)应该足够吗?
答案 0 :(得分:75)
假设字符串中的文字表示:
xxx.xxx.xxx.xxx
格式,12 + 3
分离器)这是字符串的最大长度。
以字符串形式存储的替代方法:
INT UNSIGNED
与INET_ATON
和INET_NTOA
一起处理从地址到号码,从号码到地址SELECT INET_ATON('209.207.224.40'); -> 3520061480 SELECT INET_NTOA(3520061480); -> '209.207.224.40'
BIGINT
(8字节),但这将使用两个字段。答案 1 :(得分:8)
在数值上,IPv4地址长度为32位,IPv6地址长度为128位。因此,您需要至少 16 字节的存储空间。
如果您存储的“字符串”是字节形式的地址编码,则16就足够了。
答案 2 :(得分:6)
如果您将它们存储为字符串而不是位模式:
IPv4地址由四个3位十进制字符和三个.
分隔符组成,因此只需要15个字符,例如255.255.255.255
。
IPv6地址由八个4位十六进制字符和七个:
分隔符组成,因此需要39个字符,例如0123:4567:89ab:cdef:0123:4567:89ab:cdef
。
答案 3 :(得分:2)
假设您没有附加任何网络信息(例如LL标识符,类或CIDR掩码),则IPv4地址最多为15个字符(4x3个数字+ 3个周期),IPv6地址最多可达39个字符。
答案 4 :(得分:2)
您可以使用VARBINARY(16)以二进制格式存储IPv6地址。
然后,需要使用此数据的应用程序可以使用其inet_pton / ntop实现来操作此数据,或者您可以安装类似于http://labs.watchmouse.com/2009/10/extending-mysql-5-with-ipv6-functions/
的UDF的UDF答案 5 :(得分:2)
ipv6地址可能是46个字符。
参考: IPv4映射的IPv6地址 混合双栈IPv6 / IPv4实现可识别特殊类别的地址,即IPv4映射的IPv6地址。在这些地址中,前80位为零,后16位为1,其余32位为IPv4地址。可以看到这些地址具有以标准IPv6格式写入的前96位,并且剩余的32位以IPv4的常规点十进制表示法写入。例如,:: ffff:192.0.2.128表示IPv4地址192.0.2.128。 IPv4兼容IPv6地址的弃用格式为:: 192.0.2.128。[61]
答案 6 :(得分:2)
除了已经说过的,还有Link-Local IPv6地址。如果要保留地址以便可以使用字符串创建连接,则还需要保留范围ID。 在Windows上它是一个16位数字,在Linux上它可以是一个字符串 - 接口名称,我没有找到接口名称的最大长度。