存储和检索IPv4和IPv6地址

时间:2016-05-20 18:35:43

标签: php mysql ip-address ipv6 ipv4

关于在PHP / MySQL设置上存储IPv4和IPv6地址的最佳方法,有一百万个问题,但答案要么过时(只有IPv4),要么是矛盾/不完整。

我已经创建了这个问题,并提供了一个明确的答案,为您提供了所需要知道的一切。

2 个答案:

答案 0 :(得分:3)

当您只需担心IPv4时,可以使用PHP的ip2longlong2ip快速轻松地将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

哪些应该易于存储和搜索。

我之前为此编写了一个帮助类,我只是将它推到GithubPackagist,以防其他人认为它有用。