我有一个大约10K行的表,我正在尝试改变,以便field field定界符从不为null.我试图做一个alter语句,期望任何空值被更改为默认值,但是我从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]
据了解,这意味着数据超出了这一行的字段大小,但是(a)字段中的数据在该行为(null),并且(b)我可以使用值’ 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”).
但是它应该被截断的值是null.有人可以向我解释这里发生了什么吗?怎么解决呢?
[ETA:现有的fielddelimiter字段定义是char(1)(允许null,没有默认值),因此它不应该具有值> 1个char,一个select确认它没有.字段中的不同值为NULL,“(空字符串),’p’,’t’和’y’.