根本原因是Navicat客户端未正确声明连接层编码,需在连接高级设置中手动添加CharSet=UTF-8(ODBC 17+)或characterEncoding=utf8(JDBC),并重启Navicat生效。
Navicat 连 SQL Server 时中文显示为问号或方块
根本原因不是 sql server 字符集问题,而是 navicat 客户端未正确声明连接层的编码方式。sql server(尤其是 2016+)默认用 utf-8 或 chinese_prc_ci_as 等排序规则,但 navicat 的 odbc/jdbc 驱动在建连时若没显式指定字符集,会 fallback 到系统 locale(比如 windows 的 gbk),导致插入/查询中文时解码错位。
- 检查当前连接是否启用了
UTF-8协议支持:SQL Server 2019+ 才原生支持UTF-8排序规则;旧版本只能靠客户端转义,不能依赖服务端自动转换 - Navicat 默认使用 Microsoft ODBC Driver for SQL Server,它不读取 Windows 区域设置来决定字符集,必须手动配置
- 别改数据库或列的 collation——乱码不在服务端存储层,改了反而可能破坏已有数据一致性
在 Navicat 连接属性里设置 UTF-8 编码参数
这是最直接有效的修复动作。不是改「字符集」下拉菜单(那个对 SQL Server 无效),而是进高级设置加驱动参数。
- 右键已保存的连接 → 「编辑连接」→ 切到「高级」选项卡
- 找到「ODBC 连接字符串」或「附加参数」输入框(不同 Navicat 版本位置略有差异,v16 叫「连接属性」,v17 叫「驱动参数」)
- 追加:
CharSet=UTF-8(仅限 Microsoft ODBC Driver 17+;若用 JDBC,请用characterEncoding=utf8) - 如果用的是旧版驱动(如 SQL Server Native Client),
CharSet参数会被忽略,必须升级驱动
查询结果乱码但插入正常?检查 Navicat 自身界面编码
有时候 INSERT 中文成功、SELECT 出来却是乱码,说明写入没问题,是 Navicat 渲染结果集时用了错误编码。
- 进入 Navicat「工具」→「选项」→「外观」→「字体」,确认「结果网格字体」支持 Unicode(如
Consolas、Microsoft YaHei,别用Fixedsys) - 关闭「工具」→「选项」→「查询」里的「启用查询结果缓存」——缓存可能固化旧编码解析结果
- 执行一次
SET NAMES UTF8无用(SQL Server 不认这条命令),不要试
用 SSMS 对比验证,排除 Navicat 配置遗漏
SSMS 是微软官方工具,它连 SQL Server 从不乱码,因为驱动内置了正确的编码协商逻辑。用它做基准能快速定位是不是 Navicat 独有问题。
- 在 SSMS 中执行相同查询,确认中文显示正常 → 说明服务端和数据本身没问题
- 对比 Navicat 和 SSMS 的连接字符串(右键连接 →「属性」→「连接信息」可查看部分参数)
- 特别注意 Navicat 是否勾选了「使用 Windows 身份验证」——某些域环境下会触发 NTLM 协商,间接影响字符集协商流程
真正卡住人的地方往往不是驱动版本或参数拼写,而是「以为改了连接字符串就生效」,却忘了重启 Navicat 实例——参数只在新建连接时加载,已打开的查询窗口不会动态更新编码策略。











