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