navicat查询结果乱码需同步配置连接编码(mysql选utf8mb4、postgresql选utf-8或加参数)、验证character_set_client等变量值、设置支持unicode的结果网格字体,并关闭查询结果缓存。
navicat 查询结果乱码,**不是改完连接属性里的“编码”下拉框就自动好了**——必须确认你选的是真正生效的 utf-8 变体,且驱动、服务端、字体三者没拖后腿。
Navicat 连接高级设置里“编码”下拉框选什么才有效
这个下拉菜单在不同数据库类型下含义不同,不能无脑选“UTF-8”:
- MySQL / MariaDB:必须选
utf8mb4(不是utf8,MySQL 的utf8是 3 字节伪 UTF-8,不支持 emoji 和部分汉字) - PostgreSQL:选
UTF-8或留空 + 手动加options=-c%20client_encoding%3DUTF8更可靠 - SQL Server:下拉菜单选“UTF-8”无效,得进「驱动参数」栏手动加
CharSet=UTF-8(仅 ODBC Driver 17+ 支持) - 如果下拉框里压根没有
utf8mb4或UTF-8,说明 Navicat 版本太老(v12 以前),必须升级或改用连接字符串参数
改了编码但“测试连接”通过,查询还是乱码?检查这三点
测试连接只验证账号密码和网络通路,不校验字符集协商是否成功:
- 执行
SHOW VARIABLES LIKE 'character_set%';(MySQL)或SHOW client_encoding;(PostgreSQL),确认character_set_client/client_encoding真的是utf8mb4或UTF8 - 查一下当前连接的 collation:
SELECT @@collation_connection;,如果不是utf8mb4_unicode_ci类型,WHERE比较可能隐式转码 - 右键连接 → “编辑连接” → “高级” → 勾选“运行前执行命令”,填入
SET NAMES utf8mb4;(MySQL)或SET client_encoding TO 'UTF8';(PostgreSQL),避免首次查询前未初始化
结果网格显示问号或方块,其实是字体问题
即使所有字符集都对了,Navicat 渲染层仍可能崩:
- 进「工具」→「选项」→「外观」→「字体」,把「结果网格字体」换成明确支持 Unicode 的字体,比如
Consolas、Microsoft YaHei(Windows)、Noto Sans CJK SC(Linux) - 别用
Fixedsys或DejaVu Sans—— 它们在中文场景下常 fallback 到缺失字形,显示为空格或方块 - 改完字体必须完全退出 Navicat(不只是关窗口),再重开才生效
- Linux 用户额外检查系统 locale:
locale | grep -E "LANG|LC_CTYPE",如果不是zh_CN.UTF-8或en_US.UTF-8,界面控件本身就会乱码
最易被忽略的一点:Navicat 的「查询结果缓存」会固化旧编码解析结果。关闭「工具」→「选项」→「查询」里的「启用查询结果缓存」,再重新执行查询——很多看似“重启无效”的情况,其实卡在这儿。











