静谧
发布于

从 utf8mb3 升级到 utf8mb4 后 ENUM 列变为可为 null 的问题

最近将 MySQL 数据库的字符集从 utf8mb3 升级到 utf8mb4。一个表列被定义为 ENUM('saved', 'updated', 'deleted') NOT NULL DEFAULT 'saved'。

但是,在执行字符集升级后,注意到列定义意外更改为 ENUM('saved', 'updated', 'deleted') DEFAULT NULL,使其可为空,默认值为 NULL。

它应保留 not null 并默认为saved的

浏览 (172)
点赞
收藏
1条评论
Klustron小助手
Klustron小助手
要解决此问题,需要使用新数据格式创建一个表,这样如果出现任何问题,可以恢复数据,而无需回滚或运行一些备份。首先,运行 show create table yourtable; 看到表的定义,将命令完全复制到文本编辑器中,在此新脚本中更改三项内容:create table yourtable 有yourtable -> yourtable_temp 将要更改的字段的列定义更改为更适合您的字段 从此定义中删除您不感兴趣的字段,只保留 YOUR 和 YOU CHANGE 的字段id 现在,运行这个脚本,它有类似create table yourtable_temp ... 您的数据:insert insert into yourtable_temp(id, your_enum_field) select id, your_enum_field from yourtable; 现在您的原始表并确保它看起来像alter alter table yourtable modify column your_enum_field ENUM('saved', 'updated', 'deleted') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'saved'; 现在检查您的数据。如果它很好,那么你可以临时创建的表。如果不是,则drop update yourtable join yourtable_temp on yourtable.id = yourtable_temp.id set yourtable.your_enum_field = yourtable_temp.your_enum_field; 检查数据,它应该是正确的。然后就可以删除临时表。
点赞
评论