Navicat中文乱码需按四层顺序排查:系统locale(设为zh_CN.UTF-8)、Navicat字体(选Noto Sans CJK SC等)、连接编码(强制UTF-8)、数据库字符集(改utf8mb4)。
Linux系统locale没设对,Navicat界面直接变方块
navicat for linux 本身不自带中文字体渲染逻辑,它完全依赖系统级的 lc_ctype 和 lang 环境变量来决定用哪种编码解析和显示字符。如果终端里跑 locale 输出的是 en_us.utf-8 没问题,但要是出现 posix、c 或者 zh_cn.gb18030 这类非 utf-8 的值,界面控件(比如连接名、菜单项、字段列表)就大概率乱码。
实操建议:
- 先运行
locale看当前设置;若LANG或LC_CTYPE不是zh_CN.UTF-8或en_US.UTF-8,别改 Navicat,先修系统 - 临时生效:在启动 Navicat 前执行
export LANG=zh_CN.UTF-8和export LC_ALL=zh_CN.UTF-8 - 永久生效:编辑
/etc/locale.conf(全局)或~/.bashrc(用户级),写入LANG="zh_CN.UTF-8",然后source ~/.bashrc并重启终端 - 注意:Ubuntu/Debian 用户需先确认该 locale 已生成,用
locale -a | grep zh_CN.utf8查;没有就运行sudo locale-gen zh_CN.UTF-8
Navicat字体不支持中文,菜单和结果栏全是问号
即使系统 locale 正确,Navicat 若用了不带汉字字形的字体(比如默认的 DejaVu Sans、Liberation Sans),界面上所有中文位置都会 fallback 成 或空格——这不是编码问题,是缺字。
实操建议:
- 打开 Navicat → 工具 → 选项 → 外观 → 字体,把「编辑器字体」和「界面字体」都改成含中文的字体,例如:
AR PL ZenKai Uni、Noto Sans CJK SC、WenQuanYi Zen Hei - 别选
Fixedsys—— 它在 Linux 下本质是等宽位图字体,不支持 Unicode 扩展区,表情和生僻字照样崩 - 如果系统没装这些字体,用包管理器安装:
sudo apt install fonts-wqy-zenhei(Ubuntu/Debian)或sudo dnf install wqy-zenhei-fonts(Fedora/RHEL) - 改完必须完全退出 Navicat(不是关闭窗口),再重新启动才生效
连接 MySQL 时编码未显式指定,查出来的中文全成乱码
这是最典型的“三层脱节”:数据库存的是 UTF-8,Navicat 界面能显示中文,但连接层用的是 latin1 握手,导致数据传输阶段就被错误转码了一次。现象是表结构看着正常,但 SELECT 结果里中文全变成 æäº›å 这种。
实操建议:
- 右键连接 → 「编辑连接」→ 「高级」选项卡 → 找到「编码」下拉框,**强制选
UTF-8**(不是「自动」,自动有时会 fallback 到 latin1) - 如果「高级」里没这个选项,点开「其他选项」文本框,手动加参数:
characterEncoding=utf8(MySQL 5.7+ 推荐用characterEncoding=utf8mb4) - 验证是否生效:连上后执行
SELECT @@character_set_client, @@character_set_connection, @@character_set_results;,三个值都应为utf8mb4 - ⚠️ 注意:这个设置只影响当前连接,每个新连接都要单独配;不要指望改一次全局生效
数据库/表/字段字符集仍是 latin1,Navicat 再怎么配也白搭
Navicat 是客户端,它不能改变数据底层存储格式。如果建库时没指定 CHARACTER SET utf8mb4,或者表字段用的是 varchar(255) CHARACTER SET latin1,那 Navicat 即使用 UTF-8 连,读出来的字节流本身就已经错位了——就像拿高清解码器播一盘坏磁带。
实操建议:
- 检查库级字符集:
SHOW CREATE DATABASE your_db;,如果不是DEFAULT CHARSET=utf8mb4,立刻改:ALTER DATABASE your_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 检查表级:
SHOW CREATE TABLE your_table;,若ENGINE=InnoDB DEFAULT CHARSET=latin1,执行:ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 特别注意:已有数据在转换前务必
mysqldump备份;CONVERT TO会重写整张表,大表慎用 - 新建库/表时,永远显式声明:
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
真正卡住人的从来不是某一个设置,而是系统 locale、Navicat 字体、连接参数、数据库字符集这四层里任意一层掉链子。修的时候别跳着试,按「系统 → Navicat 界面 → Navicat 连接 → 数据库结构」这个顺序逐层验证,否则容易以为修好了,其实只是掩盖了更底层的问题。











