繁体   English   中英

使用INET_ATON存储IP-有符号还是无符号整数?

[英]Storing IP with INET_ATON - signed or unsigned integer?

是否有必要使用无符号整数列在MySQL中存储IP(v4)地址(已使用INET_ATON转换)?

我自发地认为这并不重要,因为无论如何定义该字段,都将使用相同的数据通过INET_NTOA将其转换回去。 因此,唯一的区别是,在一种情况下,您会在数据库中看到一个负数,而在无符号的情况下,您会看到一个(完全)不同的正数,而两种情况下的实际数据都相同,只是表示形式因字段定义而有所不同, 那是对的吗?

INET_ATON()上文档中

若要存储INET_ATON()生成的值,请使用INT UNSIGNED列而不是带符号的INT。 如果使用带符号的列,则不能正确存储与第一个八位位组大于127的IP地址相对应的值。 请参见第11.2.6节“超出范围和溢出处理”

为什么不只使用unsigned来保证兼容性? 在您的方案中使用unsigned有什么不利之处,这将使您对此表示怀疑?

简短答案:如果要存储IP的第一个八位组大于127,则USIGNED是必需的!

来自MySQL文档,有关11.2.6超出范围和溢出处理

  • 如果启用了严格的SQL模式,则按照SQL标准,MySQL会拒绝超出范围的值并产生错误,并且插入将失败。

  • 如果没有启用限制模式,MySQL会将值裁剪到范围的适当端点,并存储结果值。

所以,如果你尝试存储IP地址127.255.255.255相比更大的在发生什么SIGNED INTEGER字段,阉限制模式启用与否,但在任何情况下,它工作,你会希望它依赖。

即使未启用限制模式...

当将超出范围的值分配给整数列时,MySQL将存储代表该列数据类型范围的相应端点的值。 如果将256存储到TINYINTTINYINT UNSIGNED列中,则MySQL分别存储127或255。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM