从存储的inet_pton()中获取MySQL的价值

时间:2014-06-17 14:21:09

标签: php mysql

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

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

1 个答案:

答案 0 :(得分:0)

我自己遇到了这个问题。就像评论所建议的那样,如果您使用的是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

话虽如此,看来确实可以使用INET6_*函数转换INET_*地址。作为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)

希望这对某人有用。