用于存储IPv4,IPv6地址作为字符串的大小

时间:2010-08-11 04:38:02

标签: mysql

在MySQL数据库中将IPv4,IPv6地址存储为字符串应该是理想的大小。 varchar(32)应该足够吗?

7 个答案:

答案 0 :(得分:75)

假设字符串中的文字表示:

  • IPv4的15个字符(xxx.xxx.xxx.xxx格式,12 + 3 分离器)
  • 39 characters(32 + 7 分隔符)for IPv6

这是字符串的最大长度。

以字符串形式存储的替代方法:

  • IPv4是32位,因此可以容纳4个字节的MySQL数据类型,INT UNSIGNEDINET_ATONINET_NTOA一起处理从地址到号码,从号码到地址
SELECT INET_ATON('209.207.224.40');
        -> 3520061480

SELECT INET_NTOA(3520061480);
        -> '209.207.224.40'
  • 对于IPv6,遗憾的是MySQL不具有16字节的数据类型,但是可以将IPv6置于规范形式,然后将它们分成2 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上它可以是一个字符串 - 接口名称,我没有找到接口名称的最大长度。