使用来自PHP脚本的inet_pton()存储IP地址。它们存储在数据库的varbinary(16)字段中。但是我现在需要查询并返回仅用MySQL存储的IP地址,但这似乎是一个任务!
我尝试使用MySQL的INET_NTOA(),但由于某种原因它只返回0.0.0.0。有人有什么想法吗?
答案 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)
希望这对某人有用。