升级MySQL字符集从utf8mb3到utf8mb4后ENUM列意外变为可空
解决MySQL utf8mb3转utf8mb4后ENUM列NOT NULL约束丢失问题
问题原因
在批量执行字符集转换(比如ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4;)时,MySQL对ENUM这类依赖字符集的列,会重新生成列定义,可能会忽略原有NOT NULL约束和默认值配置,导致列变为可空且默认值重置为NULL。
修复步骤
- 恢复列的正确约束
执行以下SQL语句,明确指定列的ENUM选项、NOT NULL约束和默认值:
ALTER TABLE 你的表名 MODIFY COLUMN 你的列名 ENUM('saved', 'updated', 'deleted') NOT NULL DEFAULT 'saved' CHARACTER SET utf8mb4;
注意替换语句中的你的表名和你的列名为实际名称。
排查升级操作漏洞
检查升级时使用的字符集转换命令:如果是批量转换整表字符集,这种操作容易丢失列级约束。后续升级建议针对单个列显式定义约束,避免依赖自动转换逻辑。验证修复结果
执行以下命令确认列定义已恢复:
DESCRIBE 你的表名; -- 或者查看完整表结构 SHOW CREATE TABLE 你的表名;
检查输出中目标列的Null属性为NO,Default属性为'saved'即可。
预防措施
- 升级前用
mysqldump -d 数据库名 > 表结构备份.sql导出所有表结构,方便对比升级后的差异。 - 避免使用整表批量转换字符集的命令,优先针对单个列执行带约束的ALTER语句。
- 升级完成后,重点检查ENUM、SET这类特殊类型列的约束和默认值是否保留。
内容的提问来源于stack exchange,提问作者johnd3v
相关产品推荐
相关产品推荐

