本文约 3,042 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
很多人做数据库迁移或备份还原时都遇到过这种糟心事:网站文章、评论里的中文,导入后全变成了问号”?”、方块”□□□”或者”æ–‡ç« “这种鬼画符,英文和数字却完好无损。这几乎可以肯定不是数据丢失,而是字符集(编码)在导出或导入的过程中被搞错了。WordPress 从 4.2 版本起默认使用 utf8mb4 字符集,它能完整支持中文、emoji 和各类特殊符号,而很多人操作时用了默认的 latin1 或旧的 utf8,两边对不上,中文自然就成了乱码。下面按”导出、导入、库、连接”四个环节,逐一教你设对,把中文救回来。
故障原因分析
- 导出时字符集选错。phpMyAdmin 导出对话框中如果没指定字符集,可能按默认的 latin1 导出,中文在文件里就已经被错误编码了。
- 导入时字符集选错。即使 .sql 文件里是 utf8mb4,如果导入时页面选了 latin1,MySQL 会按错误编码解读,写进去还是乱码。
- 数据库或表的默认字符集不是 utf8mb4。库和表本身如果建成了 latin1,存中文会丢字节,导入导出都救不回。
- 连接字符集不对。WordPress 的 wp-config.php 里如果写的是
DB_CHARSET为 utf8,而数据实际是 utf8mb4,某些四字节字符会出问题;反过来老站点用 utf8 库遇到 emoji 也会乱。
- 导入工具或编辑器改了编码。用记事本打开再保存 .sql 文件、或用不支持 utf8mb4 的旧版工具导数据,都会破坏编码。
- 先导出错误编码、后导出正确编码,顺序不当。如果已经用错误方式导入过一次,新数据表里存的就是坏数据,需要从原始导出文件重新导入,而不是反复折腾字符集。
分步解决方案
别急着删数据:先判断乱码能否恢复
如果原始 .sql 导出文件还在,且当时导出时字符集设置正确,那大概率是可以完全恢复的,重新按正确方式导入即可。如果原始文件已经丢了,表里的乱码基本不可逆,只能从更早的备份找回。所以第一步是找到并留好那份原始导出文件。
方法一:导出时正确设置字符集
在 phpMyAdmin 里选中数据库,点”导出”标签。关键就两个地方:
- 导出方式选”自定义(Custom)”,这样才会展开详细选项。
- 在”格式特定选项”或”字符集”里,选择
utf8mb4(没有的话选 utf8)。勾选”输出”里的”添加 CREATE DATABASE / USE”按需选择。
确认后点执行,下载到的 .sql 文件用编辑器打开,能看到 SET NAMES utf8mb4; 这样的语句,说明编码设对了。
方法二:导入时正确设置字符集
导入时同样不能大意。在 phpMyAdmin 里选中数据库,点”导入”标签,选择 .sql 文件后:
- 找”字符集”选项,选
utf8mb4(或 utf8)。 - 确保”允许中断导入”等选项不影响处理,点执行。
如果文件较大超过上传限制,可在服务器上用命令行导入,这样最不容易乱码:
mysql -u 你的用户 -p --default-character-set=utf8mb4 你的数据库名 < backup.sql
--default-character-set=utf8mb4 是关键,明确告诉 MySQL 按 utf8mb4 解读这个文件。
方法三:修库和表的字符集
如果导入后仍乱码,检查库和表的默认字符集:
SELECT default_character_set_name
FROM information_schema.SCHEMATA
WHERE schema_name = '你的数据库名';
若返回不是 utf8mb4,把整库和表批量改成 utf8mb4。先改库:
ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
再改表(示例,表名按实际替换):
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_options CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
对全部 wp_ 表都要做。可以用下面的查询生成所有表的 ALTER 语句,再复制执行:
SELECT CONCAT('ALTER TABLE ', table_name,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE table_schema = '你的数据库名' AND table_type = 'BASE TABLE';
注意 COLLATE 要一致,否则连表提示 collation 不匹配。utf8mb4_unicode_ci 兼容性好,也可用 utf8mb4_general_ci。
方法四:修正 wp-config.php 的连接字符集
打开网站根目录的 wp-config.php,确认这两行:
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
一般 DB_COLLATE 留空即可,让 WordPress 按 utf8mb4 默认排序规则处理。改完保存。
方法五:验证是否修好
登录后台看文章标题和内容是否恢复正常;也可以直接查库:
SELECT post_title FROM wp_posts WHERE post_status = 'publish' LIMIT 10;
中文正常显示说明成功。若仍是乱码,说明这份数据是用错误编码写进去的,需要回到原始导出文件重新按方法一、二导入。
常见踩坑点
- 用记事本打开 .sql 再保存。记事本会改编码,导致文件损坏,用 VS Code、Notepad++ 并保持 UTF-8 无 BOM。
- 导出默认字符集没改。phpMyAdmin 导出的字符集默认值不一定是你想要的,一定要手动确认。
- 只在导入设了字符集,导出没设。两头都要对,缺一不可。
- 库改了表没改。整库改造要覆盖库、表、字段三层,光改库不够。
- utf8 与 utf8mb4 混用。老站点用 utf8 存 emoji 会丢字符,建议统一升级到 utf8mb4。
- 反复导入同一份坏文件。如果第一次导入方式就是错的,重复导入只会更乱,要从源头重来。
总结
phpMyAdmin中文乱码几乎都是字符集在导出、导入、库表、连接这四个环节里对不上造成的,解决核心就一句话:全程统一用 utf8mb4。导出和导入时手动选对字符集,用命令行导入时加上 --default-character-set=utf8mb4,再把库和所有 wp_ 表 CONVERT 到 utf8mb4,最后在 wp-config.php 里把 DB_CHARSET 设为 utf8mb4,中文就能恢复如初。前提是你要留好原始的 .sql 文件,因为一旦乱码数据写进库,再改字符集也变不回正确内容,只能从备份重来。
