![](/img/trans.png)
[英]Invalid query, syntax to use near '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存储到
TINYINT
或TINYINT UNSIGNED
列中,则MySQL分别存储127或255。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.