Как бороться с тихим переполнением целых чисел в mysql sum ()? - PullRequest
3 голосов
/ 29 июня 2009

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

SELECT SUM(myIntColumn) as foo FROM myTable;

возвращаемое значение не имеет смысла - оно меньше единственного наибольшего максимального значения. Мои значения для этого столбца максимальны где-то около 500 м, и подписанное 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

1 Ответ

4 голосов
/ 29 июня 2009

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

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

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

ALTER TABLE myTable CHANGE COLUMN myIntColumn myBigIntColumn BIGINT UNSIGNED ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...