Php ip4和ip6以不同的方式转换
我想将IP的范围存储到数据库中。问题是有些IP是ipv4,有些是ipv6。我想将所有内容转换为ipv6,然后存储到数据库中。例如: 根据: 192.168.1.100=>0:0:0:0:ffff:c0a8:164 问题在于php以不同的方式处理它们:Php ip4和ip6以不同的方式转换,php,ip,ipv6,Php,Ip,Ipv6,我想将IP的范围存储到数据库中。问题是有些IP是ipv4,有些是ipv6。我想将所有内容转换为ipv6,然后存储到数据库中。例如: 根据: 192.168.1.100=>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')); 00000000000000000000
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地址一样存储不是一个好主意 它们是完全不同的东西
如果您运行的服务器只在禁用了
IPv6的情况下侦听IPv6套接字,则可能会遇到:ffff:
版本。然后,您会注意到IPv4主机192.168.1.100
以的身份连接:ffff:c0a8:164
。但是您不能通过IPv6连接到此地址-为此,您需要一个IPv4套接字。因此,最好以简短的形式存储地址,这样就更容易通过长度来区分它们。我认为将IPv4地址完全像IPv6地址一样存储不是一个好主意
它们是完全不同的东西
如果您运行的服务器只在禁用了IPv6的情况下侦听IPv6套接字,则可能会遇到:ffff:
版本。然后,您会注意到IPv4主机192.168.1.100
以的身份连接:ffff:c0a8:164
。但是您不能通过IPv6连接到此地址-为此,您需要一个IPv4套接字。因此,最好以简短的形式存储地址,这样就更容易通过长度来区分它们。IPv4地址与IPv6地址不同。你不能把一个变成另一个——它们是不同的野兽。PHP对待它们的方式不同并不奇怪。好吧,IPv6也与IPv4兼容。@werva那么你就知道错了。网络之间有网关,但通常是分开的。最好以简短的形式存储IPv4地址,以便更容易区分。@glglgl,那么你的意思是我应该将它们存储到两个不同的表中吗?@werva否,但可以作为varchar/varbinary,这样你可以立即检测不同的长度,甚至可以在连接时为地址族字段添加一个字节。但后者是可选的;如果只有IPv4和IPv6地址,则长度足够。IPv4地址与IPv6地址不同。你不能把一个变成另一个——它们是不同的野兽。PHP对待它们的方式不同并不奇怪。好吧,IPv6也与IPv4兼容。@werva那么你就知道错了。网络之间有网关,但通常是分开的。最好以简短的形式存储IPv4地址,以便更容易区分。@glglgl,那么你的意思是我应该将它们存储到两个不同的表中吗?@werva否,但可以作为varchar/varbinary,这样你可以立即检测不同的长度,甚至可以在连接时为地址族字段添加一个字节。但后者是可选的;如果你只有IPv4和IPv6地址,那么长度就足够了。我发现这个也很有用。我发现这个也很有用。