是否有必要使用 unsigned 整数列来存储MySQL中的IP(v4)地址(已使用INET_ATON
转换)?
我自发会认为这无关紧要,因为无论字段如何定义,都会使用相同的数据将其转换回INET_NTOA
。
因此,唯一的区别是,在一种情况下,您在数据库中看到负数,而使用无符号时,您会看到(完全)不同的正数,而实际数据在两种情况下都相同,只是表示因字段定义而异,这是对的吗?
答案 0 :(得分:4)
要存储INET_ATON()生成的值,请使用INT UNSIGNED列 而不是INT,签名。如果使用带符号的列,则为值 对应于第一个八位字节较大的IP地址 超过127无法正确存储。请参阅Section 11.2.6, “Out-of-Range and Overflow Handling。
为什么不使用unsigned来保证兼容性?在你的场景中使用unsigned会有什么缺点让你质疑这个?
答案 1 :(得分:1)
简短回答: USIGNED
是必要的,如果你想存储一个IP大于127的第一个八位字节!
来自关于11.2.6 Out-of-Range and Overflow Handling的MySQL文档:
如果启用了严格的SQL模式,MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败。
如果没有启用限制模式,MySQL会将值剪辑到范围的相应端点,并存储结果值。
那么如果您尝试在SIGNED INTEGER
字段中存储大于127.255.255.255的IP地址会发生什么情况,取决于是否启用了更强的限制模式,但在任何一种情况下它都 NOT 强大>按照你想要的方式工作。
当为整数列分配超出范围的值时,MySQL会存储表示列数据类型范围的相应端点的值。如果将256存储到
TINYINT
或TINYINT UNSIGNED
列,MySQL将分别存储127或255。