首页 文章

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

提问于
浏览
0

是否有必要使用 unsigned 整数列来存储MySQL中的IP(v4)地址(已使用 INET_ATON 转换)?

我自发会认为它确实无关紧要,因为无论字段如何定义,都将使用相同的数据将其转换回 INET_NTOA . 因此,唯一的区别是,在一种情况下,您在数据库中看到负数,而使用无符号时,您会看到(完全)不同的正数,而实际数据在两种情况下都相同,只是表示因字段定义而异, 那是对的吗?

2 回答

  • 1

    来自docs on INET_ATON()

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

    为什么不使用unsigned来保证兼容性?在你的场景中使用unsigned的缺点是什么会让你质疑这个?

  • 4

    Short answer: USIGNED 是必要的,如果你想存储一个大于127的第一个八位字节的IP!

    来自MySQL Docs关于11.2.6 Out-of-Range and Overflow Handling

    如果启用了严格的SQL模式,则MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败 . 如果未启用限制模式,MySQL会将值剪辑到范围的相应 endpoints ,并存储结果值 .

    那么,如果您尝试在 SIGNED INTEGER 字段中存储大于127.255.255.255的IP地址会发生什么情况,取决于是否启用了更强的限制模式,但在任何一种情况下它都可以按照您的意愿工作 NOT .

    即使没有启用限制模式......

    将超出范围的值分配给整数列时,MySQL会存储表示列数据类型范围的相应 endpoints 的值 . 如果将256存储到TINYINT或TINYINT UNSIGNED列中,MySQL将分别存储127或255 .

相关问题