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
È stato utile?

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 ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top