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

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


当前回答

正如维基百科关于IPv6的文章所描述的那样,

IPv6地址通常被写成 八组四个十六进制 数字,每个组被分开 用冒号(:)

典型的IPv6地址:

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

它有39个字符长。IPv6地址有128位长,所以您可以使用二进制(16)列,但我认为我将坚持使用字母数字表示。

其他回答

听一个三种方法都试过的人的话……只需使用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

当人们可以将IP地址压缩成原始数据时,人们谈论的是字符。

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

这比建议的39个字节要少得多(假设字符集是ascii)。

也就是说,您必须解码和编码原始数据中的IP地址,这本身是一件微不足道的事情(我以前做过,请参阅PHP的ip2long()用于32位IP)。

Edit: inet_pton(及其相反的inet_ntop())可以满足您的需要,并且可以同时处理这两种地址类型。但要注意,在Windows上,它从PHP 5.3起就可用了。

正如维基百科关于IPv6的文章所描述的那样,

IPv6地址通常被写成 八组四个十六进制 数字,每个组被分开 用冒号(:)

典型的IPv6地址:

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

它有39个字符长。IPv6地址有128位长,所以您可以使用二进制(16)列,但我认为我将坚持使用字母数字表示。

如果你想用标准表示法处理IPV6,有8组4个十六进制数字:

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

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

注意:如果你还想将IPV4地址映射为IPV6地址,请像@Deepak建议的那样使用45个字符。