必须将character_set_client、character_set_connection、character_set_results三者同时设为utf8mb4,且navicat连接高级设置中显式选择utf8mb4(非auto或utf8),并确保表字段实际编码与之对齐,服务端my.cnf需配置character-set-server=utf8mb4且重启生效。
navicat 连接 mysql 5.7 出现中文乱码,不是数据库“存错了”,而是连接层把字节错解了——必须让 character_set_client、character_set_connection、character_set_results 三者同时为 utf8mb4,且与表字段实际编码对齐。
确认当前连接的字符集三件套是否一致
在 Navicat 查询窗口中执行:
SHOW VARIABLES LIKE 'character_set%';
重点关注这三项的值是否全为 utf8mb4:
character_set_clientcharacter_set_connectioncharacter_set_results
只要其中任意一个不是 utf8mb4,哪怕表和库已经是 utf8mb4,也会显示问号或方块。这不是数据损坏,是解码错位。
Navicat 连接设置必须显式指定 utf8mb4(不能靠 Auto 或 utf8)
右键连接 → “编辑连接” → 切换到“高级”选项卡:
- 勾选
Override default charset(别信 Auto,它在 MySQL 5.7 下常 fallback 到 latin1) - 下拉框选择
utf8mb4(不是utf8:MySQL 的utf8是伪 UTF-8,不支持 emoji 和部分汉字) - 务必点击“测试连接”成功后再点“确定”——只保存不测试,设置不生效
如果下拉菜单里没有 utf8mb4,说明 Navicat 版本太老(v12 及更早),需升级到 v15+;或手动在连接字符串末尾加参数:?charset=utf8mb4。
检查并修正表字段的实际字符集
即使连接和库设对了,旧表字段可能仍是 latin1 或 utf8。执行:
SHOW CREATE TABLE `your_table`;
看两处:
- 建表语句末尾是否有
DEFAULT CHARSET=utf8mb4 - 每个
VARCHAR字段定义后是否带CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
若没有,不要直接用 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4——它会隐式重编码,已有数据可能被破坏。正确做法是:
- 针对单个字段修改:
ALTER TABLE `t` MODIFY `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 先备份,再操作;有索引的字段注意重建成本
服务端 my.cnf 必须配对生效,不能只改 client 段
MySQL 5.7 不再认 default-character-set(已废弃)。编辑 /etc/my.cnf 或 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini,确保包含:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' [client] default-character-set = utf8mb4
改完重启 MySQL 服务,再验证 SHOW VARIABLES LIKE 'character_set_server' 是否为 utf8mb4。
真正容易被忽略的是:Navicat 的连接设置优先级高于服务端配置,所以即使 my.cnf 全配对了,Navicat 连接没设 utf8mb4,照样乱码——这是绝大多数人卡住的地方。











