先执行SHOW VARIABLES LIKE 'character_set%';检查character_set_client、character_set_connection、character_set_results是否均为utf8mb4,任一非utf8mb4即为乱码根源;加密字段需设binary,普通中文字段须确保连接层与表结构字符集统一为utf8mb4。
查清乱码是哪一层出的问题
phpmyadmin显示问号、方块或一堆,不等于数据损坏,而是某一层字符集错配。关键先定位:是查询结果渲染错,还是数据存进去就错了?执行 show variables like 'character_set%';,重点看三值:character_set_client、character_set_connection、character_set_results。只要其中任一不是 utf8mb4(中文场景)或 binary(加密字段场景),就可能出乱码。
加密字段(AES_ENCRYPT等)显示乱码必须设为 binary
加密函数如 AES_ENCRYPT 返回的是 VARBINARY,本质是二进制流,不是文本。MySQL 默认按 character_set_results 解释字节——若该值为 utf8mb4,就会强行把 0x68656C6C6F 当 UTF-8 字符渲染,结果就是乱码或方块。
- 临时方案:每次查前手动执行
SET NAMES binary; - 根本方案:在 phpMyAdmin 的
config.inc.php中为对应服务器配置加两行:$cfg['Servers'][$i]['charset'] = 'binary';和$cfg['Servers'][$i]['connection_charset'] = 'binary'; - 注意:设成
binary后,正常中文字段也会显示为十六进制(如0xE4B8AD),这是预期行为,不代表数据异常
普通中文字段乱码优先检查连接层和表结构
如果查普通 VARCHAR 字段也乱码,大概率是连接层或存储层没对齐。不能只改 phpMyAdmin 界面里的“语言”或“字符集”下拉框——那只是前端提示,不影响 MySQL 实际行为。
- 导入/查询前务必先执行
SET NAMES utf8mb4;(MySQL 5.7+ 推荐)或SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; - 确认表字段真实编码:
SHOW CREATE TABLE your_table;,看字段定义末尾是否有CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 旧表修复别用
ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4——它会二次转码已损坏的数据。应先用SELECT HEX(column_name) FROM table LIMIT 1;判定原始字节是否为合法 UTF-8,再针对性修改字段声明
phpMyAdmin 配置文件里这几项必须显式设对
phpMyAdmin 5.1+ 默认不强制字符集,完全依赖 MySQL 服务端返回值。而 MySQL 服务端若未配置,默认仍是 latin1。光改 phpMyAdmin 界面语言没用。
-
$cfg['Servers'][$i]['charset'] = 'utf8mb4';—— 控制 phpMyAdmin 自身发送 SQL 时的解释逻辑 -
$cfg['Servers'][$i]['connection_charset'] = 'utf8mb4';—— PHP mysqli 连接时显式指定,PHP 7.4+ 必须加 -
$cfg['DefaultCharset'] = 'utf8mb4';—— 影响新建库/表的默认值 - 改完必须重启 Web 服务(Apache/Nginx)和 MySQL 服务,配置才生效
binary,一个要 utf8mb4,混用会导致一方永远乱码。得根据查询目标动态切换,或者分环境配置不同服务器入口。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











