客户端IP地址的最大长度

可能重复:
IPv6地址的文本表示的最大长度?

你会推荐什么作为存储客户端IP地址的数据库列的最大大小? 我现在设置为16,但是我可以得到一个比IPv6更长的IP地址吗?

对于IPv4,您可以避开存储IP地址的4个原始字节(IP地址中各个时间段之间的数字均为0-255,即一个字节)。 但是,那么你将不得不翻译进出数据库,这是凌乱的。

IPv6地址是128位(而不是32位IPv4地址)。 它们通常写成8个由四个hex数字组成的数字: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 。 39个字符适合以这种格式存储IPv6地址。

编辑:但是,有一个警告,请参阅@ Deepak的回答有关IPv4映射的IPv6地址的详细信息。 (正确的最大IPv6string长度是45个字符 。)

有一个通用的39个字符的IPv6结构的警告。 对于IPv4映射的IPv6地址,string可以更长(超过39个字符)。 一个例子来显示这个:

IPv6(39个字符):

 ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD 

IPv4映射的IPv6(45个字符):

 ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190 

注意:最后32位(对应于IPv4地址)最多可能需要15个字符(因为IPv4使用4个1字节的组,并且被格式化为0到255之间的4个十进制数字,用点分隔( .字符) ,所以最大的是DDD.DDD.DDD.DDD )。

因此,正确的最大IPv6string长度是45。

这实际上是我参加IPv6培训的一个测验问题。 (我们都回答了39!)

如果要以标准符号处理IPV6,则有8组4位hex数字:

 2001:0dc5:72a3:0000:0000:802e:3370:73E4 

32个hex数字+7个分隔符= 39个字符。

小心:如果您还想将IPV4地址映射为IPV6地址,请使用45个字符,如@Deepak所示 。

把它从三个方面尝试过的人中拿出来…只要使用一个varchar(39)

效率稍低一点的存储远远胜过在插入/更新时将其转换的任何好处,并在任何地方显示时将其格式化。

如IPv6维基百科文章中所述,

IPv6地址通常写成八组,每组四个hex数字,每组由冒号(:)分隔

一个典型的IPv6地址:

 2001:0db8:85a3:0000:0000:8a2e:0370:7334 

这是39个字符长。 IPv6地址是128位长,所以你可以想象使用二进制(16)列,但我想我会坚持一个字母数字表示。

如果您只是将其存储起来以供参考,则可以将其存储为string,但是如果要查找,例如,要查看IP地址是否在某个表中,则需要“规范化表示”。 把整个事情转换成(大)数是正确的。 IPv4地址可以存储为长整型(32位),但需要128位编号来存储IPv6地址。

例如,所有这些string都是相同的IP地址:127.0.0.1,127.000.000.001,:: 1,0,0:0:0:0:0:0:1

当人们可以将IP地址压缩成原始数据时,人们正在讨论字符。

所以原则上我们只使用IPv4(32位)或IPv6(128位),这意味着您最多需要128位空间,或者128/8 = 16个字节

这比build议的39个字节less得多(假设charset是ascii)。

也就是说,你将不得不解码和编码原始数据的IP地址,这本身是一件小事(我之前做过,请参阅PHP的ip2long()为32位IP)。

编辑: inet_pton (和它的对面, inet_ntop() )做你所需要的,并与两种地址types。 但是要小心,在Windows上它是从PHP 5.3开始的。

IPv4使用32位,forms如下:

 255.255.255.255 

我想这取决于你的数据types,无论你只是存储为CHARtypes的string,或者如果你使用数字types。

IPv6使用128位。 除非包含其他信息,否则IP将不会更长。

IPv6被分组为4个hex数字组成的分隔符,如(来自维基百科):

 2001:0db8:85a3:0000:0000:8a2e:0370:7334 

您可以安全地将它存储为39个字符的string,如果您希望这样做。 尽pipe如此,还有其他的简写方法来写地址。 一组零可以被截断为单个0,或者一组零可以被双冒号完全隐藏。