一般 39 个字符的 IPv6 结构有一个警告。对于 IPv4 映射的 IPv6 地址,字符串可能更长(超过 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
)。
因此,正确的最大 IPv6 字符串长度为 45。
这其实是我参加的一次IPv6培训中的一道问答题。 (我们都回答了39!)
对于 IPv4,您可以存储 IP 地址的 4 个原始字节(IP 地址中句点之间的每个数字都是 0-255,即一个字节)。 但是这样你就必须翻译进出数据库的内容,这很混乱。
IPv6 地址为 128 位(与 IPv4 地址的 32 位相反)。 它们通常写为 8 组,每组 4 个十六进制数字,并用冒号分隔:2001:0db8:85a3:0000:0000:8a2e:0370:7334
。 39 个字符适合以此格式存储 IPv6 地址。编辑:但是,有一个警告,有关 IPv4 映射的 IPv6 地址的详细信息,请参阅@Deepak 的答案。 (正确的最大 IPv6 字符串长度是
45 个字符。)
2001:0dc5:72a3:0000:0000:802e:3370:73E4
32 个十六进制数字 + 7 个分隔符 = 39 个字符。
注意:如果您还想将 IPV4 地址映射为 IPV6 地址,请按照 @Deepak 的建议使用 45 个字符。
效率稍低的存储远远超过了在插入/更新时转换它以及在任何地方显示它时格式化它的任何好处。
IPv6 维基百科文章中所述,
IPv6 地址通常写为 八组四十六进制 数字,其中每组都是分开的 用冒号 (:)典型的 IPv6 地址:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
此长度为 39 个字符。 IPv6 地址长 128 位,因此您可以使用二进制 (16) 列,但我认为我会坚持使用字母数字表示形式。
例如,所有这些字符串实际上都是相同的 IP 地址:127.0.0.1, 127.000.000.001, ::1, 0:0:0:0:0:0:0:1
255.255.255.255
我想这取决于您的数据类型,无论您只是存储为 CHAR 类型的字符串还是使用数字类型。
IPv6 使用 128 位。 您的 IP 长度不会超过此长度,除非您在其中包含其他信息。
IPv6 分为 4 个十六进制数字组,用冒号分隔,例如(来自维基百科):
2001:0db8:85a3:0000:0000:8a2e:0370:7334
如果您愿意,可以安全地将其存储为 39 个字符的长字符串。 不过,还有其他书写地址的速记方法。 零组可以截断为单个 0,或者可以用双冒号完全隐藏零组。
所以原则上,由于我们只使用 IPv4(32 位)或 IPv6(128 位),这意味着您最多需要 128 位空间,即 128/8 =
16 字节!
远小于建议的 39 字节(假设字符集为 ascii)。也就是说,您必须将 IP 地址解码和编码到原始数据中/从原始数据中解码和编码,这本身就是一件微不足道的事情(我以前做过,请参阅 PHP 的
ip2long()
了解 32 位 IP)。
编辑:inet_pton
(及其相反的
inet_ntop()
)可以满足您的需要,并且适用于两种地址类型。但请注意,在 Windows 上它从 PHP 5.3 起就可用。