如何处理静默 mysql sum() 整数溢出?

Stu*_*son 3 mysql sql sum overflow

我有一张包含一int(11)列和数亿行的表格。当我运行一个查询时

SELECT SUM(myIntColumn) as foo FROM myTable;
Run Code Online (Sandbox Code Playgroud)

返回值没有意义——它小于单个最大的最大值。我对该列的值最大在 500m 左右,并且带符号的 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

sou*_*rge 5

您可以通过将值转换为无符号值来加倍范围:

SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ...
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...
Run Code Online (Sandbox Code Playgroud)