一、前言:最常遇到的中文乱码故障
作为开发者,你是否也曾遭遇过这种令人抓狂的情况?MySQL客户端、连接和结果编码全部设置为 UTF-8,但在 Navicat 中查看中文时,却出现乱码或表格筛选失效,Excel 导入后更是满屏问号。

问题根源其实只有一个:character_set_server=latin1(服务端编码为拉丁字符集)。无论其他配置多么完善,只要这个环节出错,整条链路就会崩溃。
本文将从临时应急和永久根治两个层面,彻底解决 Navicat 中文乱码问题,帮你填平这个坑。
二、乱码核心根源(99%的开发者都踩过坑)
先看一个典型的编码异常分布:
- 客户端/连接/结果编码均为 utf8/utf8mb4(表面正常)
- 服务端核心:character_set_server = latin1(真正的病根)
character_set_server 是 MySQL 的只读启动参数,无法通过 SQL 命令临时修改,必须修改配置文件并重启数据库。所有新建的数据库和表都会默认继承这个编码,这正是乱码反复出现的根本原因。
两种乱码类型必须区分清楚
✅ 字母乱码(汉å):尚可挽救,这只是客户端解析问题,数据本身并未损坏。
❌ 问号乱码(???):基本无法恢复,数据写入时已被 latin1 截断丢弃,只能通过备份重新导入。
三、常见的三大误区
误区1:认为 SET 命令可以修改 server 编码
这完全行不通。执行 SET character_set_server = utf8mb4; 会直接报错——该变量只读,无法修改,只能通过修改配置并重启解决。
误区2:认为客户端设为 UTF-8 即可避免乱码
当服务端为 latin1 时,旧数据虽可通过临时设置正常显示,但新建的库、表及写入的新数据,必然会变成问号,导致数据损坏。
误区3:认为 Navicat 查询和筛选使用同一个会话
Navicat 顶部的筛选器会创建独立会话,因此常出现“查询正常、筛选乱码”的奇怪现象——原因就在于此。
四、临时急救方案(无需重启,立即恢复显示)
适用于线上紧急情况,暂时无法重启数据库,主要解决查询和筛选时的乱码显示问题。
操作步骤:
- 右键点击数据库连接 → 选择编辑连接 → 进入高级选项卡
- 取消勾选「使用MySQL字符集自动选择」
- 手动选择字符集为 utf8mb4
- 在初始化命令框中填入以下代码:
SET NAMES utf8mb4;SET character_set_client=utf8mb4;SET character_set_results=utf8mb4;
- 关闭所有数据库标签页,重新打开连接即可生效
优点:即时生效,无需重启;缺点:仅对当前连接有效,新数据写入时仍会出现乱码,治标不治本。
五、永久根治方案(一劳永逸,彻底解决乱码)
1. 修改 MySQL 配置文件
Windows 系统修改 my.ini,Linux 系统修改 my.cnf,替换为以下完整配置:
[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'skip-character-set-client-handshake
2. 重启 MySQL 服务
- Windows:在服务列表中找到 MySQL 服务并重启
- Linux:运行
systemctl restart mysqld
3. 验证配置是否生效
执行以下 SQL 语句,确认所有编码均已变为 utf8mb4:
SHOW VARIABLES LIKE 'character_set%';
4. 修复已有数据库和表的编码
# 修改数据库编码ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 转换数据表编码(保留原有数据)ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
六、Excel 导入中文乱码专属解决方案
Excel 直接导入确实容易产生乱码,推荐以下方案,几乎不会出错:
- 先将 Excel 另存为 CSV UTF-8(逗号分隔)格式,兼容性最好,乱码概率最低
- 导入时手动选择 UTF-8 编码,不要使用自动检测
- 手机号、数字等长字段应提前设置为文本格式,避免科学计数法导致数据丢失
- 确保目标数据表编码已设置为 utf8mb4
七、界面方框乱码解决方案(字体问题)
如果中文显示为 □ 方框,则与编码无关,是字体缺失所致:
- Navicat 工具 → 选项 → 记录
- 将网格字体改为微软雅黑或 Noto Sans CJK SC
- 重启 Navicat 即可
八、快速排查清单(建议收藏)
- ✅ 服务端编码
character_set_server=utf8mb4 - ✅ Navicat 连接配置为 utf8mb4 并添加初始化编码命令
- ✅ 数据库及数据表统一使用 utf8mb4 编码
- ✅ 数据导入优先采用 UTF-8 CSV 格式
- ✅ 界面异常时优先更换中文字体并重连会话
结语
MySQL 中文乱码的根本原因从来不是客户端配置,而是服务端 server 编码不统一。临时 SET NAMES 只能解决燃眉之急,只有彻底修改服务端编码、统一全链路为 utf8mb4,才能从根源上一劳永逸地解决问题。下次再遇到乱码,按照这个清单排查,基本不会出错。
