¿Cómo lidiar con el desbordamiento de enteros silencioso de mysql sum()?
Pregunta
Tengo esta mesa con un int(11)
columna y cientos de millones de filas.Cuando ejecuto una consulta como
SELECT SUM(myIntColumn) as foo FROM myTable;
el valor de retorno no tiene sentido: es menor que el valor máximo más grande.Mis valores para esta columna alcanzan un máximo de alrededor de 500 m, y el int firmado debería poder manejar ~ 2 mil millones, por lo que supongo que mysql está experimentando un desbordamiento de enteros y no dice nada al respecto.
¿Qué hacer?
Detalles varios que podrían importar pero probablemente no:
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
Solución
Puede duplicar el rango convirtiendo el valor en un valor sin signo:
SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ...
Hay un tipo de datos más grande: el BIGINT, pero desafortunadamente no puede CAST()
a ella. Si desea utilizarlo, debe cambiar su columna a ese tipo:
ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow