将IPv4,IPv6地址存储为string的大小

在MySQL数据库中存储IPv4,IPv6地址作为string的理想大小应该是多less。 应该varchar(32)是足够的?

假设在一个string中的文字表示:

  • IPv4有15个字符( xxx.xxx.xxx.xxx格式,12 + 3分隔符)
  • 用于IPv6的39个字符 (32 + 7分隔符)

这些是string的最大长度。

存储为string的替代方法:

  • IPv4是32位的,所以可以容纳4个字节的MySQL数据types将会这样做,使用INT UNSIGNEDINT_ATONINET_NTOA共同处理从地址到数字的转换,并且从数字到地址
 SELECT INET_ATON('209.207.224.40'); -> 3520061480 SELECT INET_NTOA(3520061480); -> '209.207.224.40' 
  • 对于IPv6,不幸的是,MySQL没有16字节的数据types,但是可以将IPv6放入规范forms,然后将它们分隔成2个BIGINT (8个字节),但是这将使用两个字段。

在数值上,IPv4地址长度为32位,IPv6地址长度为128位。 所以你需要至less有16个字节的存储空间。

如果你存储的“string”是字节forms的地址编码,那么16就足够了。

如果您将它们存储为string而不是位模式:

IPv4地址由四个3位十进制字符和三个字符组成. 分隔符,所以只需要15个字符,如255.255.255.255

IPv6地址由8个4位hex字符和7个分隔符组成,因此需要39个字符,如0123:4567:89ab:cdef:0123:4567:89ab:cdef

假设您没有附加任何networking信息(如LL标识符,类或CIDR掩码),则IPv4地址最多为15个字符(4×3数字+3个句点),IPv6地址最多可以包含39个字符。

您可以使用VARBINARY(16)以二进制格式存储IPv6地址。

需要使用这些数据的应用程序可以使用它们的inet_pton / ntop实现来处理这些数据,或者你可以像http://labs.watchmouse.com/2009/10/extending-mysql-5那样安装一个UDF -with-IPv6的function/

ipv6地址可能是46个字符。

参考:IPv4映射的IPv6地址混合双栈IPv6 / IPv4实现可识别特殊的一类地址,IPv4映射的IPv6地址。 在这些地址中,前80位为零,后16位为1,其余32位为IPv4地址。 可以看到这些地址的前96位是用标准的IPv6格式写的,其余的32位是用IPv4的通常的点十进制表示的。 例如,:: ffff:192.0.2.128表示IPv4地址192.0.2.128。 不支持IPv4的IPv6地址的格式是:: 192.0.2.128。[61]

除此之外,还有Link-Local IPv6地址。 如果你想保留地址,以便你可以使用string来创build连接,你还需要保持作用域ID。 在Windows上它是一个16位的数字,在Linux上它可以是一个string – 接口名称,我没有find接口名称的最大长度。