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

时间:2014-06-02 13:10:51

标签: php mysql ip unsigned signed

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

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

2 个答案:

答案 0 :(得分:4)

来自docs on INET_ATON()

  

要存储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存储到TINYINTTINYINT UNSIGNED列,MySQL将分别存储127或255。