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

您建议存储客户端ip地址的数据库列的最大大小是多少?我现在已经把它设置为16,但我可以得到一个ip地址,比IPv6更长,等等?


当前回答

听一个三种方法都试过的人的话……只需使用varchar(39)

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

其他回答

听一个三种方法都试过的人的话……只需使用varchar(39)

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

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

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

一般的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字节,并且格式化为4个十进制数字,范围为0-255,中间用点隔开。字符),所以最大值是DDD.DDD.DDD.DDD)。

因此,正确的最大IPv6字符串长度是45。

这实际上是我参加的IPv6培训中的一个测试问题。(我们都回答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个用冒号分隔的十六进制数字,如(from wikipedia):

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

如果您希望这样做,将其存储为39个字符的长字符串是安全的。不过,也有其他速记方法来写地址。0集合可以被截断为一个0,或者0集合可以被双冒号完全隐藏。