У меня есть таблица размером около 10 тыс. строк, которую я пытаюсь изменить, так что поле fielddelimiter
никогда не является нулевым. Я пытаюсь сделать выражение alter, ожидая, что любые значения NULL будут изменены на значение по умолчанию, но я получаю сообщение об ошибке из инструкции sql.
alter table merchant_ftp_account modify column `fielddelimiter` char(1) NOT NULL DEFAULT 't';
17:08:48 [ALTER - 0 row(s), 0.000 secs] [Error Code: 1265, SQL State: 01000] Data truncated for column 'fielddelimiter' at row 3987
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]
Как я понимаю, это означает, что данные превышают размер поля в этой строке, но (а) данные в этом поле (нуль) в этой строке и (б) я могу обновить эту строку непосредственно с помощью значение 't', и я не получаю ошибку усечения. Если я обновляю эту строку с ненулевым значением и попытаюсь повторно запустить оператор alter, он не будет работать в следующей строке, где fielddelimiter
имеет значение null. [ETA: Я понимаю, что MySQL может обновляться в любом направлении, но я могу отслеживать его прогресс по мере изменения строк.]
В документах MySQL есть предупреждение:
Warning This conversion may result in alteration of data. For example, if you shorten a
string column, values may be truncated. To prevent the operation from succeeding if
conversions to the new data type would result in loss of data, enable strict SQL mode
before using ALTER TABLE (see Section 5.1.6, "Server SQL Modes").
Но значения, которые он якобы усекают, являются нулями. Может ли кто-нибудь объяснить мне, что здесь происходит? И как его решить?
[ETA: существующее определение поля fielddelimiter
char (1) (разрешает null, значение по умолчанию), поэтому оно не должно иметь значений > 1 char, а выбор подтверждает, что это не так. Различными значениями в поле являются NULL, '' (пустая строка), 'p', 't' и 'y'.]