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