根本原因是config.inc.php中字符集配置未同步更新:必须同时设置$cfg['Servers'][$i]['charset']、$cfg['Servers'][$i]['connection_charset']和$cfg['DefaultCharset']均为'utf8mb4',且MySQL服务端character_set_server也须为utf8mb4,三者缺一不可。

phpMyAdmin 升级到 5.2 后旧主题出现乱码,根本原因不是字体或语言包损坏,而是 config.inc.php 中的字符集配置未同步更新、$cfg['DefaultCharset'] 缺失或设为 utf8(非 utf8mb4),同时旧主题 CSS/JS 文件里可能硬编码了 charset=gb2312 或未声明 UTF-8,导致浏览器按错误编码解析 HTML 文本节点。
检查 config.inc.php 的三项关键字符集配置是否齐全且一致
5.2 版本对连接层字符集校验更严格,缺一不可。打开 /etc/phpMyAdmin/config.inc.php 或你部署路径下的该文件,确认以下三行都存在且值为 'utf8mb4':
$cfg['Servers'][$i]['charset'] = 'utf8mb4';$cfg['Servers'][$i]['connection_charset'] = 'utf8mb4';$cfg['DefaultCharset'] = 'utf8mb4';
若其中任意一项缺失、拼写错误(如写成 utf8)、或值为 latin1 / gb2312,都会导致页面标题、导航栏文字、SQL 结果中的中文显示为问号或方块。特别注意:PHP 7.4+ 必须显式设置 connection_charset,否则仍走默认 utf8 别名(即 utf8mb3)。
验证主题 HTML 模板是否声明了 UTF-8 字符集
旧主题(尤其是从 4.x 迁移来的自定义模板)常在 header.inc.php 或主 index.php 里漏掉或写错 <meta charset>。打开主题目录下对应文件,查找并修正:
立即学习“PHP免费学习笔记(深入)”;
- 必须存在且唯一:
<meta charset="UTF-8">(注意大小写,不能是utf-8或utf8) - 不能与
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">共存,后者会覆盖前者 - 该标签必须位于
最前面,早于任何<title></title>或 CSS 引入
如果主题用了 include('common.inc.php') 等公共头文件,也要检查那个文件——乱码往往藏在被 include 的底层文件里。
排查语言包 JSON 格式与 PHP json 扩展是否匹配
5.2 默认启用 JSON 语言包(./lang/zh.json),但旧主题可能仍依赖 PHP 数组格式(./lang/zh.lib.php)。若你手动替换了语言包或修改过 select_lang.lib.php:
- 确认
./lang/zh.json是合法 UTF-8 编码且无 BOM(用hexdump -C zh.json | head -n 1验证前三个字节不是ef bb bf) - 检查 PHP 是否启用了
json扩展:php -m | grep json,无输出则需在宝塔或命令行中启用 - 若坚持用数组格式语言包,必须确保
$cfg['Lang'] = 'zh';且./lang/zh.lib.php文件末尾有return $lang;,且整个文件保存为 UTF-8 无 BOM
常见错误是把 zh.lib.php 保存为 GBK,或 JSON 文件里用了中文逗号、全角引号,导致 json_decode() 失败后静默回退到空字符串。
别忽略 MySQL 服务端实际默认字符集是否仍是 latin1
即使 phpMyAdmin 配置全对,如果 MySQL 的 character_set_server 仍是 latin1,新建数据库/表时默认就用 latin1_swedish_ci,后续所有字段插入中文都会被截断或转义失败——此时你在 phpMyAdmin 界面看到的“乱码”,其实是数据层已损坏的结果。
执行:mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_server';",若返回 latin1,必须修改 /etc/my.cnf 的 [mysqld] 段:
$cfg['Servers'][$i]['charset'] = 'utf8mb4'; $cfg['Servers'][$i]['connection_charset'] = 'utf8mb4'; $cfg['DefaultCharset'] = 'utf8mb4';
改完重启 MySQL。不解决这个,前端再怎么调配置都是隔靴搔痒。



















