phpMyAdmin 显示问号或方块的根源是 MySQL 服务端默认字符集不支持中文(如 latin1),需修改 my.cnf 中 character-set-server = utf8mb4 并重启;同时配置 phpMyAdmin 的 charset 和 connection_charset 为 utf8mb4,PHP default_charset 设为 UTF-8,旧数据须先用 HEX() 判定真实编码再精准转换,语言包须用合法 JSON 格式且启用 json 扩展。
phpMyAdmin 页面显示问号或方块:检查 MySQL 服务端默认字符集
乱码最常见原因不是 phpmyadmin 本身,而是 mysql 服务启动时用的默认字符集不支持中文(比如 latin1)。即使你在 phpmyadmin 里选了“简体中文”,如果底层连接和表默认用的是 latin1,照样显示为 或乱码。
- 登录 MySQL 命令行,执行
SHOW VARIABLES LIKE 'character_set%';,重点看character_set_server和collation_server - 如果
character_set_server是latin1,需修改 MySQL 配置文件(如/etc/mysql/my.cnf或/etc/my.cnf),在[mysqld]下添加:[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
- 重启 MySQL 服务后,再进 phpMyAdmin,新建数据库/表时默认就是
utf8mb4,旧表需手动转换(见下一条)
phpMyAdmin 连接后仍乱码:确认连接层字符集设置
phpMyAdmin 默认用 SET NAMES utf8 初始化连接,但若 MySQL 服务器不支持 utf8(MySQL 8.0+ 默认禁用 utf8 别名),这条命令实际设成了 utf8mb3,导致 emoji 或部分生僻字存取异常。
- 打开 phpMyAdmin 配置文件
config.inc.php,找到$cfg['Servers'][$i]['charset'],设为:$cfg['Servers'][$i]['charset'] = 'utf8mb4';
- 同时确保
$cfg['Servers'][$i]['connection_charset']也设为'utf8mb4'(PHP 7.4+ 推荐显式指定) - 如果使用 Nginx/Apache,确认 PHP 的
default_charset在php.ini中是UTF-8(注意连字符,不是utf8)
旧数据乱码无法修复:别直接 ALTER TABLE CONVERT TO CHARSET
用 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 粗暴转换,常把已损坏的 latin1 编码数据二次转错,变成不可逆乱码。必须先确认当前字段真实编码状态。
- 查字段内容是否真乱码:用
SELECT HEX(column_name) FROM table_name LIMIT 1;,如果返回类似E4B8ADE69687(UTF-8 编码的“中文”),说明数据本身是 UTF-8,只是被当latin1解释了——此时只需改列声明:ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 如果
HEX()返回的是C4E3BAC3这类双字节,大概率是原gbk或latin1存的,需先导出、用 iconv 转码、再导入 - phpMyAdmin 界面里点“操作 → 排序规则”,只改排序规则不改字符集,不会修复乱码;必须同步改字符集声明
语言包没生效:别动 language 目录里的 .php 文件
很多人把下载的语言包解压到 ./lang/zh.json 就以为完事了,但 phpMyAdmin 7.0+ 强制要求语言包是 JSON 格式且必须启用 json 扩展,.php 后缀的语言文件已被废弃。
- 确认 PHP 已启用
json模块:php -m | grep json - 语言包路径必须是
./lang/zh.json(不是zh_CN.json或zh.php),文件内容格式要合法 JSON(字符串必须双引号,末尾不能有逗号) - 在
config.inc.php中明确指定:$cfg['Lang'] = 'zh';
,不要留空或写成'zh_CN' - 浏览器缓存可能让旧语言界面残留,强制刷新(Ctrl+F5)或清空 phpMyAdmin 的 session 数据(删
tmp/目录下相关文件)
字符集问题从来不是单点配置能解决的,从 MySQL server、连接层、表结构、字段定义到 phpMyAdmin 自身语言加载,五层链路上任何一环掉链子,都会表现为页面乱码。最容易被跳过的其实是连接层的 connection_charset 和旧数据的真实编码判定——这两处一错,后面全白调。
立即学习“PHP免费学习笔记(深入)”;



















