英文页面正常,中文内容显示成问号或方块,部分表尤其明显。乍看像缓存或者权限的锅,追下去往往不是。
mysqldump --default-character-set=utf8mb4 -u root -p db > db.sql mysql --default-character-set=utf8mb4 -u root -p db < db.sql
追下去是这么回事:导出时未指定字符集,导入时按默认字符集解析,中文被错误转换。
「迁移乱码」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,导出时显式指定字符集;导入前创建同字符集的库;恢复后逐表核对。
验收就看一点,中文内容显示正常,无问号与方块。