WordPress数据库字符集乱码的根本原因是客户端连接层、连接转换层和结果返回层三者字符集未统一为utf8mb4,修复需同步调整wp-config.php、MySQL配置及数据库表结构。

WordPress数据库字符集乱码,根本不是数据“坏了”,而是客户端连接层(Cl4即character_set_client)、连接转换层(character_set_connection)和结果返回层(character_set_results)三者没对齐——只要其中一项不是 utf8mb4,中文、破折号“—”、竖线“|”甚至 emoji 就可能变成问号或乱码符号。修复必须从这三层入手,缺一不可。
确认当前连接的三值是否全为 utf8mb4
别依赖配置文件,直接连上 MySQL 执行:
SHOW VARIABLES LIKE 'character_set%';- 重点看
character_set_client、character_set_connection、character_set_results这三项 - 只要有一项是
latin1、utf8(注意:不是utf8mb4)或空,就说明连接层没生效
修正 wp-config.php 中的 DB_CHARSET 和连接参数
确保 WordPress 主动声明正确的字符集,不只是靠数据库默认值:
- 在
wp-config.php文件中(/* That's all, stop editing! */之前),添加或修正这一行:define('DB_CHARSET', 'utf8mb4'); - 同时建议显式设置校对规则:
define('DB_COLLATE', 'utf8mb4_unicode_ci');(留空也可,但明确指定更稳妥) - 如果使用 PDO 或自定义 DB 类,需确保连接字符串含
;charset=utf8mb4,例如:mysql:host=localhost;dbname=yourdb;charset=utf8mb4
强制 MySQL 服务端统一按 utf8mb4 处理连接
避免客户端“谎报”字符集导致服务端误判:
- 编辑 MySQL 配置文件
my.cnf(通常位于/etc/my.cnf或/usr/my.cnf) - 在
[mysqld]段落中加入:character-set-server = utf8mb4collation-server = utf8mb4_unicode_ciskip-character-set-client-handshake = ON - 在
[client]段落中加入:default-character-set = utf8mb4 - 重启 MySQL 服务(Linux 下执行
sudo systemctl restart mysql)
同步修复已有数据库、表与字段的字符集
仅改连接不改存储结构,旧数据仍可能显示异常:
- 用 phpMyAdmin 或命令行检查数据库排序规则:
SHOW CREATE DATABASE your_db_name;—— 应为DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 对所有关键表(如
wp_posts、wp_options)执行:ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 若只想修改特定字段(如
post_content),用:ALTER TABLE wp_posts MODIFY post_content LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 操作前务必完整备份数据库

















