关于在PHP / MySQL设置上存储IPv4和IPv6地址的最佳方法,有一百万个问题,但答案要么过时(只有IPv4),要么是矛盾/不完整。
我已经创建了这个问题,并提供了一个明确的答案,为您提供了所需要知道的一切。
答案 0 :(得分:3)
当您只需担心IPv4时,可以使用PHP的ip2long
和long2ip
快速轻松地将IP地址转换为整数。然而,现在几乎每个人都应该期望在某些时候遇到一些IPv6地址,而这只会增加。
两者兼有的常见且有效的解决方案是使用 PHP 的inet_pton function(处理IPv4和v6),然后将结果存储在VARBINARY(16)
中数据库中的列。
所以,假设我们有一个IPv6地址,如:FE80:0000:0000:0000:0202:B3FF:FE1E:8329
使用inet_pton
转换并存储在VARBINARY(16)
列中时,它看起来像这样:
0xfe800000000000000202b3fffe1e8329
然后,您可以从数据库中检索它并使用inet_ntop
显示它。
例如:
echo inet_ntop($ipAddressFromDB);
这是一种在MySQL数据库中存储IP地址的快速有效方法。
答案 1 :(得分:0)
此时,如果您没有构建适合IPv6的应用程序,那么您自己也会受到伤害,随着时间的推移,这将变得更加真实。出于这个原因,我开始以IPv6格式存储所有 IP地址,并使用6to4符号表示IPv4地址。
TL; 6to4的DR是:
前缀的前16位始终为2002:,接下来的32位是IPv4地址,前缀的后16位[对此目的不重要]
因此,假设您的IP地址为222.173.190.239
,我们将其转换为6to4表示法:
sprintf('2002:%s::', implode(':', str_split(str_pad(dechex(ip2long($addr)), 8, '0', STR_PAD_LEFT), 2)));
哪个成为:2002:de:ad:be:ef::
您可以通过以下方式转换为二进制形式进行存储:inet_pton('2002:de:ad:be:ef::');
这给出了16字节的二进制文件:0x200200de00ad00be00ef000000000000
哪些应该易于存储和搜索。