SHOW CREATE TABLE users\G mysqldump --default-character-set=latin1 db > raw.sql # 转换后再导入并校验 SELECT HEX(name) FROM users LIMIT 5;
历史库一直用 latin1,新功能要存中文和表情,直接改表之后部分老数据变乱码。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:latin1 字段里存的其实是二次编码的中文,直接转换会按错误编码解释字节。
这次卡住的地方就在「MySQL 字符集转换」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:先确认现有数据真实编码;用二进制方式导出再按目标编码导入;转换后逐表抽样校验。
确认没问题再收工,抽样对比转换前后内容一致,新写入的中文与表情均正常。