用于存储IPv4,IPv6地址作为字符串的大小

use*_*108 63 mysql

什么应该是在MySQL数据库中将IPv4,IPv6地址存储为字符串的理想大小.varchar(32)应该足够吗?

bak*_*kal 77

假设字符串中的文本表示:

  • IPv4的15个字符(xxx.xxx.xxx.xxx格式,12 + 3分隔符)
  • IPv6的39个字符(32 + 7个分隔符)

这些是字符串的最大长度.

存储为字符串的替代方法:

  • IPv4是32位,因此可以容纳4个字节的MySQL数据类型,使用INT UNSIGNED是常见的,INET_ATON并且INET_NTOA处理从地址到数字的转换,以及从数字到地址的转换
SELECT INET_ATON('209.207.224.40');
        -> 3520061480

SELECT INET_NTOA(3520061480);
        -> '209.207.224.40'
Run Code Online (Sandbox Code Playgroud)
  • 对于IPv6,遗憾的是MySQL不具有16字节的数据类型,但是可以将IPv6置于规范形式,然后将它们分成2 BIGINT(8字节),但是这将使用两个字段.

  • 这是不正确的.您可以使用XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:AAA.BBB.CCC.DDD格式编写IPv6地址,其中最后一部分是嵌入式ipv4样式地址.我认为长度是45? (14认同)
  • @John,我只能用二进制文件_write_它会占用更多的空间但是,就像你的IPv4位一样,它可以从128位地址_computed_所以没有必要,特别是在数据库中. (2认同)
  • 是的,如果你明智的话,你只会以这种方式使用它.但我不认为使用随机ipv6地址实际上是非法的,所以你希望能够将它存储在你的数据库中.你可以将当然的地址标准化为全十六进制.但我仍然认为指出,合法地表示为字符串的ipv6地址可以是45个字符, (2认同)

San*_*nta 8

在数字上,IPv4地址长32位,IPv6地址长128位.所以你需要一个至少16字节的存储空间.

如果您存储的"字符串"是字节形式的地址编码,那么16就足够了.


pax*_*blo 7

如果您将它们存储为字符串而不是位模式:

IPv4地址由四个3位十进制字符和三个.分隔符组成,因此只需要15个字符,如255.255.255.255.

IPv6地址由八个4位十六进制字符和七个:分隔符组成,因此需要39个字符,如0123:4567:89ab:cdef:0123:4567:89ab:cdef.