Как бороться с тихим переполнением целых чисел mysql sum()?

StackOverflow https://stackoverflow.com/questions/1057420

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня есть этот стол с int(11) столбец и сотни миллионов строк.Когда я запускаю запрос, подобный

SELECT SUM(myIntColumn) as foo FROM myTable;

возвращаемое значение не имеет смысла - оно меньше, чем единственное наибольшее максимальное значение.Мои значения для этого столбца максимальны где-то около 500m, а подписанный int должен быть способен обрабатывать ~ 2bil , поэтому я предполагаю, что mysql испытывает переполнение целых чисел и помалкивает об этом.

Что же делать?

Разные детали, которые могут просто иметь значение, но, вероятно, нет:

  • 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
Это было полезно?

Решение

Вы можете удвоить диапазон, приведя значение к значению без знака:

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

Существует более крупный тип данных:большое дело, но, к сожалению, вы не можете CAST() к этому.Если вы хотите использовать его, вы должны изменить свой столбец на этот тип:

ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top