IPv6 的 39 个字符结构存在一个警告。 对于 IPv4 映射的 IPv6 地址,字符串可能会更长(超过 39 个字符)。以下是一个示例:
IPv6(39个字符):
ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD
IPv4-mapped IPv6(45个字符):
ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190
注意: 最后的32位(对应IPv4地址)最多可以需要15个字符(因为IPv4使用4组1字节,并且格式化为四个范围在0-255之间的十进制数字,由点号(.
)分隔,因此最大值为DDD.DDD.DDD.DDD
)。
因此,正确的IPv6字符串最大长度为45个字符。
这实际上是我参加IPv6培训中的一道测验题。(我们都回答了39!)
对于IPv4,你可以仅存储IP地址的4个原始字节(IP地址中每个点之间的数字都是0-255,即一个字节)。但是这样会产生翻译进出数据库的问题,不够简洁。
IPv6地址为128位(相比IPv4地址的32位),通常写为由冒号分隔的8组4位十六进制数字:2001:0db8:85a3:0000:0000:8a2e:0370:7334
。以这种格式存储IPv6地址需要39个字符。
编辑:然而,有一个细节需要注意,关于IPv4映射IPv6地址的详细信息请参见@Deepak's回答。(正确的IPv6字符串最大长度为45个字符。)
如果你想处理标准符号中的IPV6地址,它包括8组由4个十六进制数字组成的组:
2001:0dc5:72a3:0000:0000:802e:3370:73E4
32个十六进制数字+7个分隔符=39个字符。
注意: 如果您还想保留作为IPv6地址映射的IPv4地址,则按照@Deepak建议,使用45个字符。
%device
。
但是,如果压缩地址,则IPv6文本格式可以存储在39个字符或更少的字符中。但是,如果添加了%device
和额外的(4*3+3) - (2*4+1)
个字符(或一些位来建议打印时使用哪种格式),则会增加一些字符。 - Anders从一个尝试了所有三种方法的人的经验来看,只需使用varchar(39)
略微不那么高效的存储远远超过在插入/更新时进行转换和在任何地方显示时进行格式化的任何好处。
正如IPv6维基百科文章所述,IPv6地址通常写作八组由冒号(:)分隔的四个十六进制数字。
一个典型的IPv6地址:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
这段文字长度为39个字符。IPv6地址长度为128位,因此你可以使用二进制(16)列,但我认为最好使用字母数字表示法。
IPv4使用32位,格式如下:
255.255.255.255
我想这取决于你的数据类型,无论是仅使用CHAR类型将其存储为字符串还是使用数字类型。
IPv6使用128位。除非你要将其他信息包含在其中,否则IP不会比这更长。
IPv6被分为由冒号分隔的4个十六进制数字组成的集合,例如从维基百科引用的:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
如果您希望这样做,可以将其存储为39个字符长的字符串,这是安全的。当然,还有其他简写地址的方法。一组零可以缩短为一个0,或者一组零可以通过双冒号完全隐藏。
人们正在谈论字符,当一个IP地址可以被压缩成原始数据时。
因此,原则上,由于我们只使用IPv4(32位)或IPv6(128位),这意味着您最多需要128位的空间,或者128/8 = 16字节!
这比建议的39个字节要少得多(假设字符集为ASCII)。
也就是说,您将不得不将IP地址解码和编码为/从原始数据中,这本身是一件微不足道的事情(我以前做过,参见PHP的ip2long()
用于32位IP)。
编辑:inet_pton
(及其相反的inet_ntop()
)可以满足您的需求,并且适用于两种地址类型。但请注意,在Windows上,它仅适用于PHP 5.3以上版本。
:
(39个字符)分隔。根据使用情况,它可以以其他格式书写。内部始终是128位。但您可能还想存储如何使用它以及可选设备名称,用于链路本地地址(它们以fe80:
开头,可以附加%devname
)。是的,您也可以将最后32位写成IPv4格式,因此用IPv4的15个字符替换这9个字符(45个字符)。但是,正如所说,它们仍然只是128位,以另一种格式编写给用户。这取决于上下文。 - Anders