2

把我的问题放在透视图上:

我有一个 PHP 应用程序,它将用户的 IP 存储在 MySQL 表中。

列类型为VARBINARY(16),应用程序使用 PHPinet_pton来形成二进制字符串。

也就是说,对于典型的 IP4 地址,字符串有 4 个字节。

如何从表中检索这些 IP,以人类可读的形式显示它们?

我目前的解决方案是:

select INET_NTOA(CONV(HEX(ip),16,10)) from operation_ip;

有没有更直接的方法来做到这一点?

尤其是CONV(HEX(x),16,10)将 4 个字节更改为整数的最简单方法(实际上我认为它甚至不是整数,而是看起来像整数的字符串)。

(我使用VARBINARY(16),因为 PHPinet_pton可以为 IPv6 地址返回 16 字节。AFAIK MySQLINET_NTOA不支持 IPv6,但目前这不是我最关心的问题)。

4

1 回答 1

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'
于 2013-07-04T08:04:49.167 回答