Значение BIGINT UNSIGNED вне диапазона - PullRequest
36 голосов
/ 09 апреля 2011

Я получаю ошибку

Значение BIGINT UNSIGNED вне диапазона в '(1301980250 - mydb. news_articles. date)'

Когда я запускаю запрос

SELECT *, ((1 / log(1301980250 - date)) * 175) as weight FROM news_articles ORDER BY weight;

Удаление условия ORDER BY также устраняет ошибку. Как я могу это исправить?

Обновление: Поле даты содержит метку времени Unix (например, 1298944082). Ошибка начала появляться после того, как я обновил MySQL с 5.0.x до 5.5.x

Любая помощь, пожалуйста?

Ответы [ 7 ]

73 голосов
/ 02 августа 2012

Я недавно столкнулся с этим и нашел самое разумное решение, чтобы просто разыгрывать любые неподписанные целые числа как подписанные.

 SELECT *, ((1 / log(1301980250 - cast(date as signed)) * 175) as weight FROM news_articles ORDER BY weight
16 голосов
/ 12 апреля 2011

Проблема была вызвана переполнением целого числа без знака, как предлагает wallyk. Это может быть решено с помощью

  1. используя SELECT *, ((1 / log((date - 1301980250) * -1)) * 175) as weight FROM news_articles ORDER BY weight; (этот работал для меня) `
  2. Изменение параметра sql_mode в my.cnf на NO_UNSIGNED_SUBTRACTION (не проверял это)
4 голосов
/ 24 мая 2017

Иногда это может быть вызвано нулевыми значениями в данных.

Используйте IFNULL для установки значения по умолчанию (вероятно, 0 для временной отметки - плохое значение по умолчанию, и на самом деле в этом случае вам может быть лучше исключить и нольдаты в предложении WHERE)

SELECT (123456 - IFNULL(date, 0)) AS leVar

4 голосов
/ 11 апреля 2011

Любое значение даты после 2011-04-04 22:10:50 PDT (2011-04-05 05:10:50 utc) вызовет эту ошибку, поскольку это сделает выражение отрицательным.

2 голосов
/ 28 июля 2017

Никто не упомянул, что функция log () определена только для строго положительных аргументов. Следите за этим при использовании вычитаний внутри log ().

Что касается исходного вопроса, ключевым фактором для разрешения было сообщить нам тип данных для столбца даты. Если он не подписан, MySQL может не понравиться.

Правило состоит в том, что MySQL имеет плохой арифметический алгоритм и не может понять, как вычесть операнд B из другого A (= сделать AB), когда A закодирован на меньшее количество байтов, чем B AND B> A. *

например. A = 12 и SMALLINT, B = 13 AS INT, тогда MySQL не может понять, что такое A-B (-1!)

Чтобы создать контент MySQL, просто увеличьте длину кода операнда A. Как? Использование CAST () или умножение A на десятичное число.

Как видно, проблема переполнения меньше, чем проблема обработки знака в арифметике MySQL. Микропроцессор, а точнее, человек, не имеет проблем с выполнением такого рода арифметики ...

Использование CAST () является способом, или для краткости, просто провоцирует неявное приведение, умножая операнд A на 1. (или 1.0) :

1019 * например *

1.*A - B
2 голосов
/ 01 декабря 2014

возможно, вы можете использовать cast

SELECT *, ((1 / log(1301980250 - cast(date AS SIGNED))) * 175) as weight FROM news_articles ORDER BY weight;

0 голосов
/ 15 апреля 2019

Я только что столкнулся с этой проблемой, выполняя обновление в поле, где результат оказался меньше 0.

Решение: убедитесь, что ни одно из ваших обновлений не приводит к тому, что ваш результат будет меньше 0 в поле без знака.

...