2009-06-29 343 views
1

我得到了一张int(11)列和数亿行的表。当我运行查询如如何处理silent mysql sum()整数溢出?

SELECT SUM(myIntColumn) as foo FROM myTable; 

返回值没有意义 - 它小于单个最大的最大值。我这个列的值最大值大约在500米左右,而signed int应该能够处理〜2bil,所以我假设mysql正在经历一个整数溢出,并保持着这个值。

怎么办?

其他细节,可能只是重要,但可能不会:

  • mysql Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (x86_64) using readline 5.2
  • mysqld Ver 5.0.75-0ubuntu10 for debian-linux-gnu on x86_64 ((Ubuntu))
  • Linux kona 2.6.28-11-server #42-Ubuntu SMP Fri Apr 17 02:45:36 UTC 2009 x86_64 GNU/Linux
+0

此链接帮助? http://stackoverflow.com/questions/323294/datatype-of-sum-result-in-mysql – 2009-06-29 09:56:31

+0

我看到了,但问题似乎并不平凡,因为海报所询问的整数/字符串行为。我的MySql不够深入,无法理解这些类型的微妙之处。而我的数据库如此之大以至于无法进行交互式实验......我的一些疑问花费了数小时! – 2009-06-29 10:01:22

回答

2

您可以通过数值转换成一无符号值的两倍的范围内:

SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ... 

有一个更大的数据类型:BIGINT,但不幸的是你不能CAST()它。如果您想使用它,您必须将您的列更改为该类型:

ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...