【发布时间】:2013-11-16 00:26:39
【问题描述】:
我想将 IP 范围存储到数据库中。问题是一些IP是ipv4和一些ipv6。我想将所有转换为 ipv6 然后存储到数据库中。例如: 根据converter:
192.168.1.100 => 0:0:0:0:0:ffff:c0a8:164
问题在于 php 以不同的方式对待它们:
echo bin2hex(inet_pton('192.168.1.100'));
c0a80164
echo bin2hex(inet_pton('0:0:0:0:0:ffff:c0a8:164'));
00000000000000000000ffffc0a80164
echo bin2hex(inet_pton('0000:0000:0000:0000:0000:0000:192.168.1.100'));
000000000000000000000000c0a80164
对我来说,可以在数据库中毫无问题地进行 ip 比较(尤其是对于 ipv4)非常重要。
【问题讨论】:
-
IPv4 地址与 IPv6 地址不同。您无法将一种转换为另一种-它们是不同的野兽。 PHP 对待它们的方式不同也就不足为奇了。
-
AFAIK,IPv6 也兼容 IPv4。
-
@werva 那你就知道错了。网络之间有网关,但一般来说,它们是分开的。最好以简短的形式存储您的 IPv4 地址,以便更容易区分。
-
@glglgl,你的意思是我应该将它们存储到两个不同的表中?
-
@werva 否,但可能作为 varchar/varbinary,因此您可以立即检测到不同的长度,甚至可以为连接时所需的地址族字段添加一个字节。但后者是可选的;如果你只有 IPv4 和 IPv6 地址,那么长度就足够了。