【问题标题】:MySQL Error Code: 1264 Out of range value for column 'count' at row 1MySQL 错误代码:1264 列 'count' 在第 1 行的值超出范围
【发布时间】:2011-05-12 14:25:37
【问题描述】:

我有一些 MySQL 代码:

CREATE TABLE test_table (  
    id int(11) NOT NULL AUTO_INCREMENT,  
    count int(10) unsigned DEFAULT NULL,  
    PRIMARY KEY (id)  
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

insert into test_table (count) values (1);
update test_table set count = IF( count -1 < 0, 0 , count -1 );
update test_table set count = IF( count -1 < 0, 0 , count -1 );

如果(count -1) &lt; 0,这应该将计数设置为零。

我收到一个错误:

Error Code: 1264 Out of range value for column 'count' at row 1` instead.

这是因为 count 是一个无符号整数。如果我使用带符号的 int 它可以工作。

这是 MySQL 中的错误吗?我正在使用:mysql Ver 14.14 Distrib 5.1.46sp1, for Win32 (ia32)

【问题讨论】:

标签: mysql underflow


【解决方案1】:

我认为你应该这样做:

UPDATE test_table
SET count = IF( count < 1, 0 , count -1 )

count 为零时,count - 1 的值下溢。

选择计数,计数 - 1 FROM test_table; +-------+----------+ |计数 |计数 - 1 | +-------+----------+ | 0 | 18446744073709551615 | | 1 | 0 | | 2 | 1 | +-------+----------+

当我尝试您的查询时,它不起作用......但它并没有像您看到的那样失败。

【讨论】:

  • 我仍然看不出它应该失败的任何原因。如果 (count -1) 有符号且大于零,则必须先将其转换为无符号整数,然后再分配给 count。而且因为我从不分配任何小于零的东西来计数,如果测试失败则只分配零,这应该是相同的。转到解决方案。我的问题是 -1 只是一个例子,实际上可以是任何整数 X。不过,我可以做 IF(count
  • 编辑:也需要考虑符号:IF( count
  • 谢谢!所以它显然是在用无符号整数做算术。有道理,我猜。只是太习惯于即时为您完成自动类型转换的编程。
【解决方案2】:

如果 count 是无符号的,并且它的值为零,那么从中减去 1 会得到一个超出无符号 int 范围的值。所以正确的错误信息并且没有错误,我认为

【讨论】:

  • 但我没有将值分配给该字段。只是将其用作测试的一部分。
  • 在测试中,您尝试在 count 为零时计算 count -1。这是一个无效的计算,因为无符号值不能表示计数 - 1。Mark Byers 有正确的想法 - 尽量不要使用负值。
猜你喜欢
  • 2018-04-19
  • 2016-09-29
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2021-05-06
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多