MySQL "Усеченное неправильное значение INTEGER"

Я получаю нечетную ошибку "Усеченное неправильное значение INTEGER" при запуске следующего запроса UPDATE:

update tbl
set projectNumber = right(comments, 7)
where createdBy = 'me'
and length(CONVERT(right(comments, 7), SIGNED INTEGER)) = 7 
and CONVERT(right(comments, 7), SIGNED INTEGER) > 0
and CONVERT(right(comments, 7), SIGNED INTEGER) is not null
and createdOn > '2011-01-31 12:00:00'
and projectNumber is null

projectNumber - varchar (10).

Когда я запускаю его как прямой выбор, я не получаю сообщение об ошибке, и я вижу результаты, как ожидалось. Есть идеи? По сути, я пытаюсь обновить поле projectNumber, где конец комментариев в импортированных заметках - 7 числовых символов (но projectNumber не всегда 7 числовых, поэтому поле является varchar (10)).

Ответ 1

Это не ошибка. Это предупреждение, которое приходит от CONVERT(), когда вы просите его преобразовать нечисловое значение в целое число;

Запустите эти запросы в консоли, чтобы увидеть:

mysql> SELECT CONVERT(right('1s23d45678', 7), SIGNED INTEGER);
+-------------------------------------------------+
| CONVERT(right('1s23d45678', 7), SIGNED INTEGER) |
+-------------------------------------------------+
|                                               3 |
+-------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: '3d45678' |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)

Как я уже сказал, это предупреждение, а не ошибка. Ваш запрос должен корректно выполнять обновление.

Ответ 2

Другой распространенной причиной этого предупреждения является пробел в строке, подлежащей преобразованию. Используйте trim() до convert(), чтобы избавиться от этого.

Ответ 3

Если вы используете текстовый тип для данных столбца, и вы пытались установить значение по умолчанию как 0, просто установите его как NULL:

ALTER TABLE `__table__` 
CHANGE `__column_name__old__` `__column_name__new__` 
INT(4) NOT NULL DEFAULT '0';

Ответ 4

Я нашел одно решение, которое из коробки и может быть легко реализовано. Решение очень похоже на SET ANSI_WARNING OFF в MS SQL Server.

В MySQL сначала необходимо проверить, установлена ли конфигурация для "sql_mode", с помощью следующей команды:

SHOW VARIABLES LIKE 'sql_mode';

ИЛИ используйте ниже:

SELECT @@GLOBAL.sql_mode;

В CSV могут быть следующие наборы значений.

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Исходя из своей ошибки, вы можете удалить настройки и сбросить их с помощью следующей команды:

SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

С помощью приведенной выше команды, чтобы сбросить его. Это решило подобное этой проблемы "Усеченное неверное значение INTEGER" в моем случае. Я надеюсь, что это должно работать и от других пользователей, которые сталкиваются с этой проблемой.

Подробнее об этом "sql_mode" см. здесь.

Надеюсь, что это будет использовать полный!

Ответ 5

Как указано в других ответах, это ошибка на 2019 г., которая препятствует выполнению запроса. Чтобы выполнить запрос, даже если есть строки, которые нельзя преобразовать в числа, просто используйте UPDATE IGNORE.

Например, минимальная версия исходного кода:

UPDATE IGNORE tbl
SET projectNumber = RIGHT(comments, 7)
WHERE CONVERT(RIGHT(COMMENTS, 7), SIGNED INTEGER) > 0