客户端IP地址的最大长度

Ton*_*ger 262 sql database database-design

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

作为存储客户端IP地址的数据库列的最大大小,您会建议什么?我现在把它设置为16,但是我可以获得比IPv6更长的IP地址吗?

Dee*_*pak 413

一般的39字符IPv6结构有一个警告. 对于IPv4映射的IPv6地址,字符串可以更长(超过39个字符).举例说明:

IPv6(39个字符):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD
Run Code Online (Sandbox Code Playgroud)

IPv4映射的IPv6(45个字符):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190
Run Code Online (Sandbox Code Playgroud)

注意:最后32位(对应于IPv4地址)最多可以包含15个字符(因为IPv4使用4组1个字节,格式为4个十进制数,范围为0-255,用点(.字符)分隔,所以最大值是DDD.DDD.DDD.DDD).

因此,正确的最大IPv6字符串长度为45.

这实际上是我参加的IPv6培训中的一个测验问题.(我们都回答了39个!)

  • 在我看来,这是不正确的.根据以下内容,IPv6映射地址最长为22个字符:https://tools.ietf.org/html/rfc5952#page-10和https://tools.ietf.org/html/rfc4291#section-2.5.5 as它们的格式始终为:: ffff:000.000.000.000,并且必须缩短它们 (3认同)

Mat*_*ges 260

对于IPv4,您可以避免存储IP地址的4个原始字节(IP地址中各个句点之间的每个数字都是0-255,即一个字节).但是,你必须翻译进出DB,这很麻烦.

IPv6地址是128位(与32位IPv4地址相对).它们通常写成由冒号分隔的8组4个十六进制数字:2001:0db8:85a3:0000:0000:8a2e:0370:7334.39个字符适合以此格式存储IPv6地址.

编辑:但是,有一个警告,请参阅@ Deepak的答案,了解有关IPv4映射的IPv6地址的详细信息.(正确的最大IPv6字符串长度为45个字符.)

  • 您不将IPv4存储为4个字节的原因相同. (6认同)
  • 某些数据库(至少是postgres)具有本机IP列类型,并为您进行转换. (4认同)
  • 我会避免在数据库的同一个字段中混合使用IPv4和IPv6一段时间.IPv4仍然是默认标准,并将在未来几年继续使用.在我曾经使用的遗留应用程序中,当需要将IPv6地址添加到数据库时,这是作为单独的条目完成的.这允许预期IPv4地址的现有代码保留在原位,并允许代码继续仅获取IPv4地址.对于代码的新部分,他们可以选择专门从查询中获取IPv4,IPV6或混合. (4认同)
  • 如果您打算通过位掩码进行查询,那么显然会将其存储为字节.如果每行额外的23个字节是一个问题,那么显然存储为字节.不知道这里有什么问题. (2认同)

Dav*_*ski 25

如果要以标准表示法处理IPV6,则有8组4个十六进制数字:

2001:0dc5:72a3:0000:0000:802e:3370:73E4
Run Code Online (Sandbox Code Playgroud)

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

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


Nei*_*l N 11

从那些尝试了三种方式的人那里拿走它...只需使用varchar(39)

效率稍低的存储远远超过在插入/更新时必须转换它的任何好处,并在任何地方显示它时格式化它.


Mic*_*tta 9

IPv6维基百科文章所述,

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

典型的IPv6地址:

2001:0db8:85a3:0000:0000:8a2e:0370:7334
Run Code Online (Sandbox Code Playgroud)

这是39个字符长.IPv6地址长128位,所以你可以想象使用二进制(16)列,但我想我会坚持使用字母数字表示法.