【问题标题】:#1264 Out of range value fix?#1264 超出范围值修复?
【发布时间】:2011-10-01 01:56:51
【问题描述】:

当我尝试将以下内容插入我的 MySQL 时

INSERT INTO `rooms` (`id`, `ip`) VALUES ('131213', '-259857341');

我失败并出现以下错误:

Warning: #1264 Out of range value for column 'ip' at row 1

我正在环顾四周,但还没有找到解决方法...

我的字段是 unsigned int,对于该条目应该可以正常工作。

问题是什么,我该如何解决?

我使用 unsigned int 是因为我想使用 inet_ntoa/aton 存储 ips。

编辑:

我在 MySQL 网站上推荐使用 unsigned INT:

存储由 INET_ATON(),使用 INT UNSIGNED 列而不是 INT,即 签。如果您使用带符号的列, 对应于 IP 地址的值 第一个八位组更大 超过 127 无法正确存储。 请参见第 10.6 节,“超出范围和 溢出处理”。

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html

【问题讨论】:

  • 在上面的问题上 ;) My field is unsigned int which should work just fine for that entry. 因为 -259857341 不超过最小值也不超过最大值。
  • int 字段有多少字节?参考:dev.mysql.com/doc/refman/5.0/en/numeric-types.html
  • 您最初是如何提出负面 IP 的?你是在为某个平行宇宙编程吗?
  • @Flimzy 这不是我想出的 ip 我是从给我的一组文件中读取它,我必须将它解析到数据库中。
  • 嗯,这个“ip”,不管它来自哪里,都不是真正的IP。 IP 不能为负数。

标签: mysql int outofrangeexception mysql-error-1264


【解决方案1】:

负数超出了 UNSIGNED INT 的范围。阅读documentation 以获取给定数据类型允许值的完整列表。

【讨论】:

  • 来自 MySQL 要存储由 INET_ATON() 生成的值,请使用 INT UNSIGNED 列而不是带符号的 INT。如果使用有符号列,则无法正确存储与第一个八位字节大于 127 的 IP 地址对应的值。请参阅第 10.6 节,“超出范围和溢出处理”。
  • 我并不反对 INT UNSIGNED 对存储 IP 有意义。我只是说它不适用于存储负数。 IP 永远不会是负数。
【解决方案2】:

无符号整数至少表示非负值。

不确定这是否是您需要的,但您可以尝试像 ipconverter 一样将有符号整数转换为 4 字节无符号整数 (http://www.silisoftware.com/tools/ipconverter.php):

INSERT INTO `rooms` (`id`, `ip`) VALUES ('131213', '-259857341' & 0xffffffff);

【讨论】:

    【解决方案3】:

    首先,根据定义,您不能在unsigned int 字段中插入负数。将字段改为int(或者如果可能,使用非负数)。

    其次,我认为您应该删除插入数字周围的单引号,以将该值视为int 而不是string

    【讨论】:

      【解决方案4】:

      将您的 INT 字段更改为 BIGINT,它将顺利为我工作。

      【讨论】:

        猜你喜欢
        • 2018-07-18
        • 2022-11-26
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        • 2021-01-13
        • 1970-01-01
        • 2021-05-06
        相关资源
        最近更新 更多