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
Était-ce utile?

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 ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top