2009-06-29 5 views
1

J'ai cette table avec une colonne int(11) et des centaines de millions de lignes. Quand je lance une requête commeComment faire face à mysql sum() débordement d'entier silencieux?

SELECT SUM(myIntColumn) as foo FROM myTable; 

la valeur de retour n'a pas de sens - il est plus petit que la valeur plus grand max simple. Mes valeurs pour cette colonne atteignent un maximum autour de 500m, et l'int signé devrait être capable de gérer ~ 2bil, donc je suppose que mysql connaît un débordement d'entier, et garde maman à ce sujet.

Que faire?

divers détails qui pourraient juste matière, 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
+0

ce lien aider? http://stackoverflow.com/questions/323294/datatype-of-sum-result-in-mysql –

+0

J'ai vu cela, mais la question semblait non trivialement différente en raison du comportement entier/chaîne que l'affiche posait à propos. Mon MySql n'est pas assez profond pour comprendre ces types de subtilités. Et ma base de données est si grande que l'expérimentation interactive n'est pas possible ... quelques requêtes à moi ont pris des heures! –

Répondre

2

Vous pouvez doubler la portée par la coulée de la valeur à une valeur non signée :

SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ... 

Il y a un plus grand type de données: le BIGINT, mais malheureusement vous ne pouvez pas CAST() à lui. Si vous voulez l'utiliser, vous devez changer votre colonne pour ce type:

ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ... 
+0

J'ai dû modifier la table: Query OK, 327995915 lignes affectées (29 min 0,12 sec) ... cwazy! Merci. –

+0

J'ai eu le même problème, inversant la distribution a travaillé pour moi: SELECT CAST (SUM (myIntColumn) AS USIGNED) ... –

Questions connexes