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


Storing IP with INET_ATON - signed or unsigned integer?

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

我自然会认为这真的无关紧要,因为无论如何定义字段,将使用相同的数据将其转换回INET_NTOA。唯一的区别是,在一种情况下,你会看到一个负数,而与unsigned你会看到一个(完全)不同的正数,而实际数据是相同的,在这两种情况下,只是表示不同通过字段定义,这是正确的吗?

从INET_ATON():

要存储INET_ATON()生成的值,使用INT UNSIGNED列而不是带符号的INT。如果使用带符号的列,则值对应于第一个八位字节较大的IP地址不能正确存储127。参见第11.2.6节"超出范围"和溢出处理。

为什么不直接使用unsigned来保证兼容性?在您的场景中使用unsigned的缺点是什么?

简短的回答: USIGNED是必要的,如果你想存储一个IP与它的第一个八位字节大于127!

来自MySQL文档关于11.2.6 out - range and Overflow Handling:

  • 如果启用了严格SQL模式,MySQL会拒绝超出范围的值,并报错,插入失败,按照SQL标准。

  • 如果没有启用限制模式,MySQL将值剪辑到范围的适当端点并存储结果值。

因此,如果您尝试在SIGNED INTEGER字段中存储大于127.255.255.255的IP地址会发生什么,取决于是否启用限制模式,但在任何情况下,它都 not 如您所希望的那样工作。

即使没有启用限制模式…

当一个超出范围的值被分配给一个整数列时,MySQL存储代表该列数据类型范围的相应端点的值。如果您将256存储到TINYINTTINYINT UNSIGNED列中,MySQL将分别存储127或255。