Comment faire face au dépassement d'entier mysql sum () silencieux?
Question
J'ai ce tableau avec une int(11)
colonne et des centaines de millions de lignes. Quand je lance une requête comme
SELECT SUM(myIntColumn) as foo FROM myTable;
la valeur de retour n'a pas de sens - elle est inférieure à la plus grande valeur max. Mes valeurs pour cette colonne ne dépassent pas les 500m, et l’entier signé devrait être capable de gérer ~ 2bil, donc je suppose que mysql connaît un dépassement d’entier, et qu’il en tient compte.
Que faire?
Divers détails qui pourraient avoir de l'importance mais probablement pas:
-
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
La solution
Vous pouvez doubler la plage en convertissant la valeur en une valeur non signée:
SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ...
Il existe un type de données plus important: le BIGINT, mais malheureusement, vous ne pouvez pas CAST()
. Si vous souhaitez vous en servir, vous devez modifier votre colonne selon ce type:
ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...