在mysql表中存储IP地址的理想数据类型是什么?

19

2
我建议使用整数,然后解析它。 - Eric Frick
仅限IPv4,还是包括IPv6?只需要IP地址还是也需要子网掩码? - Martijn
一些在SO上类似的话题推荐使用varchar...那怎么样? - Robbie Dc
仅限IP地址,包括IPv4和IPv6。 - Robbie Dc
我赞同整数推荐。例如,127.000.000.001作为字符串与127.0.0.1相同。如果存储为字符串,您需要进行额外的处理来检查地址是否重复。 - Sparky
我认为128位的IPv6地址无法适应int类型。请参考http://dba.stackexchange.com/questions/904/mysql-data-type-for-128-bit-integers获取一些信息。 - Gerben
2个回答

17

IPv4地址使用32位(4字节),IPv6地址使用128位(16字节)。因此,您可以将它们的二进制表示存储在BINARY(16)VARBINARY(16)字段中。

此外,请参见我对问题“在mysql数据库中存储IP地址”的回答。它还提供了为什么选择其中之一的评论。


存储和检索工作得很好...但我不确定它是否适用于我在问题中提到的预期目的。 - Robbie Dc
2
varbinary(16) 似乎是最好的选择。 INET6_ATON('172.32.x.x') 可以将 IPv4 和 IPv6 地址都转换为 blob。同样可以使用 INET6_NTOA 进行转换回来。至少对于存储和检索,不需要在 v4 和 v6 之间搬移代码。 - Tirtha R
如何将这个 varbinary 转换为可读形式? - bansal
@Abhi,许多编程语言都有实用函数,例如在PHP中有inet_pton/inet_ntop - knittl
2
小心,您不能可靠地将IPv4和IPv6地址都存储在BINARY(16)中 - 当然,您可以猜测如果最后12个字节是null,则它可能是一个IPv4地址,但是通过这种猜测,大约42亿个IPv6地址将被错误地识别为IPv4!(另一方面,42亿个IPv6地址约占总IPv6空间的0.00000002%,但这仍然是一个错误,只是一个据推测非常难以遇到的错误) - hanshenrik

0
一个 Trie 数据类型是最优的。这种类型有未压缩和压缩的数据结构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接