【问题标题】:Get Value From MySQL Stored With inet_pton()从使用 inet_pton() 存储的 MySQL 中获取值
【发布时间】:2014-06-17 14:21:08
【问题描述】:

IP 地址是使用 PHP 脚本中的 inet_pton() 存储的。它们存储在数据库的 varbinary(16) 字段中。但是我现在需要查询并返回只存储在 MySQL 中的 IP 地址,但这似乎有点任务!

我尝试过使用 MySQL 的 INET_NTOA(),但由于某种原因它只返回 0.0.0.0。有人有什么想法吗?

【问题讨论】:

  • @AlmaDo 我读过那篇文章——它没有解决我的问题。根据我的问题,我尝试了 INET_NTOA() 并没有用。
  • 不会因为那是针对 IPv4 的。您需要 IPv6 转换。这就是链接问题的意义所在
  • 你有什么 MySQL 版本?从 5.6.3 开始,有 INET6_NTOA
  • 我现在是5.5,所以这些功能不可用。猜猜没有安装上面链接的那些功能就没有办法了吗?

标签: php mysql


【解决方案1】:

我自己也遇到了这个问题。正如 cmets 建议的那样,如果您使用的是 MySQL 5.6.3+,正确的解决方案是使用 INET6_NTOA。它处理 IPv4 和 IPv6 地址,但 IPv4 的格式与 INET_ATON 生成的格式不同(它只处理 IPv4)。后者使用与 PHP 函数ip2long 相同的格式。这是等效函数的参考表:

PHP        | MySQL
-----------|-------------
ip2long    | INET_ATON
long2ip    | INET_NTOA
inet_pton  | INET6_ATON
inet_ntop  | INET6_NTOA

话虽如此,使用INET_* 函数似乎可以转换INET6_* 地址。作为noted in this question,您可以使用以下方法将 IP 字符串转换为二进制格式:

UNHEX(HEX(CAST(INET_ATON(ipaddress) AS UNSIGNED)))
-- same as
INET6_ATON(ipaddress)

通过一些测试,我想出了如何做相反的事情:

INET_NTOA(CONV(HEX(ipaddress), 16, 10))
-- same as
INET6_NTOA(ipaddress)

希望这对某人有用。

【讨论】:

  • 简短示例:SELECT INET_NTOA(CONV(HEX("mfo?"), 16, 10));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2012-04-14
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多