我有一张带有int(11)列和数亿行的表.当我运行查询
SELECT SUM(myIntColumn) as foo FROM myTable;
返回值没有意义-小于单个最大最大值.我对此列的值最大为500m左右,而有符号的int应该能够处理〜2bil,所以我假设mysql正在经历整数溢出,并对此保持沉默.
该怎么办?
可能很重要但可能不重要的其他细节:
> mysql Ver 14.12 Distrib 5.0.75,用于使用readline 5.2的debian-linux-gnu(x86_64)
>用于x86_64上的debian-linux-gnu的mysqld Ver 5.0.75-0ubuntu10((Ubuntu))
> Linux kona 2.6.28-11-server#42-Ubuntu SMP Fri Apr 17 02:45:36 UTC 2009 x86_64 GNU / Linux
解决方法:
您可以通过将值强制转换为无符号值来使范围加倍:
SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ...
有一个更大的数据类型:BIGINT,但是不幸的是您不能将其设置为CAST().如果要使用它,则必须将列更改为该类型:
ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...
标签:sum,overflow,sql,mysql
来源: https://codeday.me/bug/20191107/2003549.html