【问题标题】:Searching for an IP address stored in binary via php mysql通过 php mysql 搜索以二进制形式存储的 IP 地址
【发布时间】:2014-04-20 23:06:45
【问题描述】:

我将 IP 地址以打包二进制形式存储在一个表中(IPv4 为 4 个字节,IPv6 为 16 个字节)。我的问题是,有没有办法通过 SQL 搜索 IP 地址?

我使用 php (inet_pton) 将它们转换为二进制文件。我不知道有任何可用的 MySQL 函数。我的困境来自于搜索 IP 地址的一部分。假设IP地址是192.168.1.101,用户搜索101。

由于 inet_pton 不适用于像 101 这样的字符串/整数,是否有搜索打包 IP 地址的替代方法?我愿意接受建议。

【问题讨论】:

  • 通过后缀搜索 IP 地址对我来说没有意义——例如,192.168.1.1011.2.3.101 之间没有关系。你想做什么?
  • @duskwuff 这是一个服务器表及其 IP 地址。用户可能不希望输入整个 IP 地址,而只是通过 IP 地址的一部分缩小结果范围。例如 192. 或 .101 或他们选择做的任何事情。
  • 不过,这不太可能是一种有用的搜索方式。 IP 地址按前缀组织;您的搜索应该在此基础上进行。
  • @duskwuff,是的,还有子网……想想 IPv6 地址。如果他们想从 /64 缩小所有 IP 地址。肯定会有用的。

标签: php mysql binary ip pack


【解决方案1】:

如果您允许您的用户输入任何有效的子字符串进行搜索,则可以使用 INET6_NTOA 函数将打包的 ipv4 或 v 6address 转换为二进制字符串,然后您可以对其进行字符串比较。这存在于 mysql 的 5.7 版本中。

【讨论】:

  • 这看起来对我的需求很有用。我正在考虑是否应该在完成此操作后以文本表示形式而不是二进制形式存储 IP 地址。与查找时的处理成本相比,我为每条记录节省的约 12-20 个字节非常小。
【解决方案2】:

我知道这个问题已经闲置了一段时间,但以防万一有人来这里尝试解决类似问题,请在此处查看我的答案:php search on a partial IP address stored in mysql as unsigned int。请注意,二进制掩码方法适用于 IPv6 地址,并且比 varchar 列更有效(在内存需求和查找时间方面)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2014-05-28
    • 2014-12-21
    • 2013-10-14
    • 2014-12-17
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多