Navicat 17无全局默认字符集设置,需同步配置MySQL服务端(my.cnf设character-set-server=utf8mb4)、连接层(编辑连接→高级→初始化命令填SET NAMES utf8mb4)、新建数据库时手动选utf8mb4及匹配collation(如utf8mb4_unicode_ci),并逐层修正表与字段字符集。
navicat 17 本身不提供“全局默认字符集”设置入口,所谓「整个模型」的字符集控制,实际依赖 mysql 服务端配置 + navicat 创建时的手动指定。跳过这层理解直接在 navicat 里找“默认设置”选项,一定会踩坑。
新建数据库时必须手动选 utf8mb4 和匹配的 collation
Navicat 17 的「新建数据库」对话框里,字符集 和 排序规则 是必填项,但默认值由 MySQL 服务端决定(常见为 latin1 或旧版 utf8),不是 Navicat 自己定义的“用户默认”。
- 右键「连接」→「新建数据库」,在弹出窗口中主动下拉选择
utf8mb4(不是utf8) -
排序规则必须与字符集严格对应:选utf8mb4就得配utf8mb4_unicode_ci或utf8mb4_0900_ai_ci(MySQL 8.0+ 推荐) - 如果下拉列表里没看到
utf8mb4_*选项,说明 MySQL 服务端未启用该字符集,需先检查并修改my.cnf中的character-set-server=utf8mb4
已存在数据库无法靠 Navicat “设默认”,只能逐层修正
Navicat 的「编辑数据库」或右键「字符集和排序规则」只改数据库级别的 DEFAULT CHARACTER SET,它不会递归更新已有表和字段——这是最常被误判的一点。
- 执行
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;后,新创建的表会继承该设置,但老表仍保持原样 - 每张表需单独进「设计表」→ 底部「表选项」→ 修改
字符集和排序规则,否则SHOW CREATE TABLE仍显示latin1 - 字段级优先级更高:即使表设了
utf8mb4,某个VARCHAR字段若显式声明CHARACTER SET latin1,它依然会乱码
连接层字符集必须在 Navicat 连接属性里显式指定
就算数据库、表、字段全设对了,Navicat 客户端和 MySQL 之间协商失败,照样插入中文变 ???。这个环节完全独立于数据库对象设置。
- 右键连接 →「编辑连接」→「高级」选项卡 → 找到
初始化命令输入框 - 填入:
SET NAMES utf8mb4;(MySQL 5.7 及以下)或SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci;(MySQL 8.0+) - 不要依赖「字符集」下拉框(那个只影响 Navicat 自身界面显示,不影响 SQL 传输)
- 验证是否生效:连上后执行
SELECT @@character_set_client, @@character_set_connection, @@character_set_results;,三者都应为utf8mb4
真正起效的字符集链条是:MySQL 服务端配置 → Navicat 连接时的初始化命令 → 新建数据库时的手动选择 → 表/字段创建时的显式声明。少任何一环,都可能在某个环节解码失败。尤其注意 utf8(即 utf8mb3)在 Navicat 下拉菜单里仍存在,但它不能存 emoji,别手滑选错。


















