我需要将生产数据库中的字段从INT更新为VARCHAR。
当前INT字段中的信息是敏感的,我想确保在更改表类型时不会无意中更改它或销毁它。例如,用户可能在此列中存储了INT 123456,并且我希望确保在转换为VARCHAR后准确存储。
实现此目的的推荐流程是什么?
在使用这样的东西时,有什么我需要担心的吗?
ALTER TABLE table_sample CHANGE col_sample col_sample VARCHAR;
提前感谢您的帮助。
答案 0 :(得分:52)
在更改列类型之前,让MySQL服务器进入严格模式,并确保varchar(n)
列有足够大的n
,以便在转换为字符串时保存所有整数。如果您没有处于严格模式,那么MySQL将silently truncate your data to fit your string size:
如果未启用严格SQL模式,并且您为
CHAR
或VARCHAR
列分配的值超出了列的最大长度,则会截断该值以适应并生成警告。对于截断非空格字符,可以导致发生错误(而不是警告),并通过使用严格的SQL模式来禁止插入值。
但如果你先进入strict mode:
mysql> set sql_mode = 'STRICT_ALL_TABLES';
mysql> alter table table_sample change col_sample col_sample varchar(6);
你会得到一个很好的错误信息:
ERROR 1406 (22001): Data too long for column 'col_sample' at row ...
如果您的整数不适合varchar
。
当然,在尝试更改表之前,您将获得数据库的全新验证备份。通过验证,我的意思是您已成功将备份恢复到测试数据库中。