Come gestire l'overflow di numeri interi silenziosi di mysql sum ()?
Domanda
Ho questa tabella con una colonna int(11)
e centinaia di milioni di righe. Quando eseguo una query come
SELECT SUM(myIntColumn) as foo FROM myTable;
il valore restituito non ha senso: è più piccolo del singolo valore massimo più grande. I miei valori per questa colonna si estendono da qualche parte intorno a 500m e l'int int firmato dovrebbe essere in grado di gestire ~ 2bil, quindi suppongo che mysql stia vivendo un overflow di numeri interi e ne trattiene la mamma.
Cosa fare?
Dettagli vari che potrebbero essere importanti ma probabilmente non:
-
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
Soluzione
Puoi raddoppiare l'intervallo trasmettendo il valore a un valore senza segno:
SELECT SUM(CAST(myIntColumn AS UNSIGNED)) ...
Esiste un tipo di dati più grande: il BIGINT, ma sfortunatamente non è possibile CAST()
ad esso. Se vuoi usarlo, devi cambiare la tua colonna in quel tipo:
ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...