本文约 2,406 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
辛辛苦苦把 WordPress 装好,输入一篇中文标题的测试文章,保存后回到前台一看,满屏都是”?????”,或者变成一串谁也认不出的怪符号;又或者你从别处导入一份 SQL 数据,原本整齐的中文全都变成了乱码。这类现象有个统称:字符集不匹配。WordPress 从很早就使用 utf8mb4 来存储内容,而很多老数据库、老主机在建库时默认用的是 latin1 或早期那种”阉割版”的 utf8,两边”说的不是同一种语言”,中文自然就崩了。乱码最让人头疼的地方在于:如果不及时处理,一旦数据已经以错误方式存进去,修复起来会麻烦很多。所以理解字符集这件事,最好在安装之前就捋清楚,实在已经装好了,也有一套标准的补救流程。
故障原因分析
1. 数据库或表使用了 latin1 字符集。 latin1 根本无法表示中文字符,存进去就会丢失、变形,一些老版本 MySQL 的默认字符集正是它。
2. WordPress 用了 utf8 而非 utf8mb4。 MySQL 里的 utf8 其实是每字符最多 3 字节的旧实现,存不下 emoji 和部分生僻字,需要 utf8mb4,这也是现在新装 WordPress 都直接推荐 utf8mb4 的原因。
3. wp-config.php 没有正确设置 DB_CHARSET。 缺少或有误时,WordPress 与数据库之间的”传输编码”对不上。
4. 导入数据时字符集选错。 用导入工具时没指定 utf8mb4,工具按默认编码解析,导致中文整体错位,从旧站导出的 SQL 尤其容易碰上这个问题。
5. 连接层字符集不一致。 表本身是 utf8mb4,但连接时用 latin1,读写依旧乱码,这类问题排查起来最隐蔽,因为表结构看着完全正常。
分步解决方案
方法一:安装阶段就选对字符集
建库时把字符集和排序规则都选成 utf8mb4:
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
建库时选对,后面几乎不会再有乱码烦恼,这是最省事的做法,很多面板(如宝塔)建库时也能直接指定字符集,记得在创建界面里把默认的 latin1 手动改成 utf8mb4 或 utf8。
方法二:正确配置 wp-config.php
// wp-config.php
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );
如果你的 WordPress 已经装好,把这行从 utf8 改成 utf8mb4 后刷新一次,让程序以新编码连接数据库,改完最好到后台【工具】→【站点健康】里确认数据库字符集已被正确识别。
方法三:转换已有表的字符集
已经是 latin1 的库,可以逐表转换(先备份数据库!),这一步会重建表结构,数据量大时要耐心等待:
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;
ALTER TABLE wp_comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 其余 wp_ 开头的表按需照做
转换完成后,顺手把这些表的默认字符集也一并更新,避免新写入的数据又用回旧编码。
方法四:以正确字符集重新导入数据
导入 SQL 时明确指定编码,避免工具自作主张,尤其是从别的服务器搬来的备份文件。
mysql --default-character-set=utf8mb4 -u 用户名 -p 数据库名 < backup.sql
用图形化工具导入时,手动把编码选项选为 utf8 / utf8mb4,而不是”自动检测”。
常见踩坑点
- 混淆 utf8 与 utf8mb4。 两者看着像,实际容量不同,能一步到位就用 utf8mb4,别事后返工。
- 只转换了表没管连接。 表和连接两头的字符集都必须一致,否则仍然乱码。
- 在已乱码的数据上直接改配置。 已经错存进去的内容不会自动复原,往往需要重新导入干净的备份。
- 导入工具乱猜编码。 图省事选”自动检测”经常出错,手动指定更可靠。
- 忘记备份。 转换字符集是有风险的操作,动手前务必完整备份数据库,出问题能回退。
- 新旧字符集混用。 转换时如果只改了部分表,站内数据一半 utf8mb4 一半 latin1,查询关联时仍会出乱码,转换要全库统一。
总结
WordPress 中文乱码的根子几乎都在字符集上,而字符集这件事,最佳策略永远是”安装时就配对”。建库用 utf8mb4,wp-config.php 里的 DB_CHARSET 也写 utf8mb4,两条线对齐,中文、emoji、生僻字就都不会出问题。如果已经装成了 latin1,也还能补救,方法是先备份,再用 ALTER TABLE 把各张表逐步转换成 utf8mb4,并确保导入和连接环节同样指定 utf8mb4。这里要划重点:能重导干净数据就别硬修乱码内容,因为字符集一旦出错,原始信息可能已经丢失。把字符集理顺之后,你会发现 WordPress 的中文环境其实非常稳。以后无论是新装站点、从旧站搬家,还是给现有站换编码,都先确认建库、配置、导入、连接这四个环节用同一个字符集,养成这个习惯,乱码基本就和你绝缘了。一旦发现乱码,先别急着写内容,把字符集核准了再动手。
