如何在关系数据库中存储IPv6兼容地址

我怎么做?


现在,将不会使用IPv6,但是我需要设计应用程序以使其支持IPv6。有必要在MySQL数据库中存储IP地址和CIDR块(也是BGP NLRI,但这是另一回事)。我一直将INT用于IPv4 +将TINYINT用于masklen,但是IPv6是128位。


哪种方法最适合呢?2xBIGINT?CHAR(16)用于二进制存储?CHAR(39)用于文本存储?8xSMALLINT在专用桌子上?


你会推荐什么?



白衣染霜花
浏览 856回答 3
3回答

慕村225694

如果您倾向于使用char(16),请改用binary(16)。binary(n)没有排序规则或字符集的概念(或者,它是字符集/排序规则为'binary'的char(n))。mysql中char的默认值是latin1_swedish_ci,这意味着它将尝试不区分大小写的排序和对latin1中有效代码点的字节值进行比较,这将导致各种意想不到的问题。另一种选择是使用无符号十进制(39,0)零填充,效率不如两个bigints(十进制将在当前版本的mysql中每9位使用4个字节),但允许您将其全部保留在一个列中并打印很好。

至尊宝的传说

请注意,如标准C标头中的INET6_ADDRSTRLEN所定义,IPv6地址的最大长度(包括作用域标识符)为46个字节。对于Internet使用,您应该可以忽略区域标识符(%10,#eth0等),但要知道getaddrinfo何时返回比预期更长的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL