客户端IP地址的最大长度[重复]

问题描述 投票:0回答:8

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

您建议存储客户端 IP 地址的数据库列的最大大小是多少? 我现在将其设置为 16,但是我可以获得比 IPv6 等更长的 IP 地址吗?

sql database database-design ipv6 ipv4
8个回答
476
投票

一般 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!)


285
投票

对于 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 个字符。)


28
投票
如果您想以标准表示法处理 IPV6,有 8 组 4 个十六进制数字:

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

32 个十六进制数字 + 7 个分隔符 = 39 个字符。

注意:如果您还想将 IPV4 地址映射为 IPV6 地址,请按照 @Deepak 的建议使用 45 个字符


13
投票
从尝试过所有三种方法的人那里得到它......只需使用 varchar(39)

效率稍低的存储远远超过了在插入/更新时转换它以及在任何地方显示它时格式化它的任何好处。


8
投票

IPv6 维基百科文章中所述,

IPv6 地址通常写为 八组四十六进制 数字,其中每组都是分开的 用冒号 (:)

典型的 IPv6 地址:

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

此长度为 39 个字符。 IPv6 地址长 128 位,因此您可以使用二进制 (16) 列,但我认为我会坚持使用字母数字表示形式。


4
投票
如果您只是存储它以供参考,则可以将其存储为字符串,但如果您想要进行查找,例如查看 IP 地址是否在某个表中,则需要“规范表示”。 将整个事物转换为(大)数字是正确的做法。 IPv4 地址可以存储为 long int(32 位),但您需要 128 位数字来存储 IPv6 地址。

例如,所有这些字符串实际上都是相同的 IP 地址:127.0.0.1, 127.000.000.001, ::1, 0:0:0:0:0:0:0:1


2
投票
IPv4使用32位,形式为:

255.255.255.255

我想这取决于您的数据类型,无论您只是存储为 CHAR 类型的字符串还是使用数字类型。

IPv6 使用 128 位。 您的 IP 长度不会超过此长度,除非您在其中包含其他信息。

IPv6 分为 4 个十六进制数字组,用冒号分隔,例如(来自维基百科):

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

如果您愿意,可以安全地将其存储为 39 个字符的长字符串。 不过,还有其他书写地址的速记方法。 零组可以截断为单个 0,或者可以用双冒号完全隐藏零组。


1
投票
当人们可以将 IP 地址压缩为原始数据时,人们正在谈论字符。

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

16 字节

远小于建议的 39 字节(假设字符集为 ascii)。

也就是说,您必须将 IP 地址解码和编码到原始数据中/从原始数据中解码和编码,这本身就是一件微不足道的事情(我以前做过,请参阅 PHP 的

ip2long()

 了解 32 位 IP)。 

编辑:inet_pton

(及其相反的
inet_ntop()
)可以满足您的需要,并且适用于两种地址类型。但请注意,在 Windows 上它从 PHP 5.3 起就可用。

© www.soinside.com 2019 - 2024. All rights reserved.