【问题标题】:What is the ideal datatype to store IP address in a mysql table? [duplicate]在 mysql 表中存储 IP 地址的理想数据类型是什么? [复制]
【发布时间】:2011-12-30 17:39:20
【问题描述】:

可能重复:
What type should I store IP addresses for MySQL?

一种可以同时容纳 IPv4 和 IPv6 地址的单一数据类型。我想存储 IP 地址以限制一个人可以在我的网站上从他/她的机器上创建的配置文件数量。

【问题讨论】:

  • 我会推荐整数然后解析它
  • 只有 IPv4 还是 IPv6?只是一个 IP 还是它的子网掩码?
  • SO 中的一些类似主题推荐 varchar... wat abt that?
  • IPv4 和 IPv6,只有 IP 地址
  • 我支持整数推荐。例如,作为字符串的 127.000.000.001 与 127.0.0.1 相同。存储为字符串,你需要做额外的处理来重复检查地址

标签: mysql sql


【解决方案1】:

trie 数据类型是最佳的。该类型有未压缩和压缩的数据结构。

【讨论】:

    【解决方案2】:

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

    另请参阅我对问题IP address storing in mysql database 的回答。它还提供了 cmets 为什么您会选择其中一个。

    【讨论】:

    • 存储和检索工作很酷......但我不确定它是否适合我在问题中提到的预期目的
    • varbinary(16) 似乎是最好的选择。 INET6_ATON('172.32.x.x') 可以将 IPv4 和 IPv6 地址转换为 blob。可以使用INET6_NTOA 将其转换回来。无需在 v4 和 v6 之间处理代码;至少用于存储和检索。
    • 如何将此 varbinary 翻译回可读形式?
    • @Abhi 在许多语言中都有实用功能,例如在 PHP 中有 inet_pton/inet_ntop
    • 小心,您可以可靠地将 ipv4 和 ipv6 地址存储在 BINARY(16) 中 - 当然,您可以猜测如果最后 12字节是空的,那么它可能是一个ipv4地址,但是根据这个猜测,大约有42亿个ipv6地址将被错误地识别为ipv4! (另一方面,42 亿个 ipv6 地址大约占 ipv6 总空间的 0.00000002%,但这仍然是一个错误,可能只是一个很难命中)
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2010-09-14
    相关资源
    最近更新 更多