提出我的问题:
我有一个PHP应用程序,它将用户的IP存储在MySQL表中。
列类型为VARBINARY(16)
,应用程序使用PHP的inet_pton
形成二进制字符串。
对于典型的IP4地址,字符串有4个字节。
如何从表中检索这些IP,以人类可读的形式显示它们?
我目前的解决方案是:
select INET_NTOA(CONV(HEX(ip),16,10)) from operation_ip;
有更直接的方法吗?
特别是CONV(HEX(x),16,10)
将4个字节更改为整数的最简单方法(实际上我相信它甚至不是整数,而是一个看起来像整数的字符串)。
(我使用VARBINARY(16)
,因为PHP的inet_pton
可以为IPv6地址返回16个字节.AFAIK MySQL的INET_NTOA
不支持IPv6,但目前这不是我最关心的问题)。
答案 0 :(得分:0)
MySQL有很好的内置函数来处理这种情况:
INSERT INTO t(ip) VALUE (INET_ATON('1.2.3.4')); -- stores integer 16909060
SELECT INET_NTOA(ip) FROM t; -- returns string '1.2.3.4'
或PHP方式:
$sql = 'INSERT INTO t(ip) VALUE (' . ip2long('1.2.3.4') . '))';
// ip2long('1.2.3.4') = 16909060
// reverse conversion: long2ip(16909060) returns '1.2.3.4'