报错“Unknown character set: 'utf8mb4'”表明MySQL服务端未加载utf8mb4支持,常见于MySQL≤5.5.2、精简版MariaDB或过时Docker镜像;需确认character_sets_dir路径下存在utf8mb4.xml,修改Index.xml添加对应collation,配置my.cnf中character-set-server=utf8mb4并重启服务,导出时可用--default-character-set=utf8降级兼容。
还原报错“Unknown character set: 'utf8mb4'”说明服务端不认这个字符集
这不是 navicat 配置错了,而是目标 mysql 实例压根没加载 utf8mb4 字符集支持。常见于老旧 mysql(≤5.5.2)、精简版 mariadb、或 docker 中用的过时镜像(如 mysql:5.1)。错误发生在解析 create table ... default charset=utf8mb4 时,服务端直接拒绝语法,不是连接层能绕过的。
- 先确认服务端是否支持:
SHOW VARIABLES LIKE 'character_sets_dir';,然后进该路径看是否存在utf8mb4.xml - 若缺失,手动复制一份
utf8.xml改名为utf8mb4.xml,并修改其中<charset name="utf8mb4">和所有id值(不能和已有重复) - 编辑
Index.xml,在末尾新增一行:<collation name="utf8mb4_general_ci" id="45" charset="utf8mb4"/>(id 必须唯一,查现有最大值后+1) - 改完重启 MySQL:
systemctl restart mysql或service mysqld restart,再验证SHOW CHARACTER SET LIKE 'utf8mb4';是否返回结果
目标库默认字符集必须设为 utf8mb4,否则新建库/表仍 fallback 到 latin1
即使服务端支持 utf8mb4,如果 character_set_server 没设对,后续创建的数据库、表、连接都会继承旧值。Navicat 还原时若建新库,CREATE DATABASE 不带 CHARACTER SET 子句,就完全依赖这个全局变量。
- 检查当前值:
SHOW VARIABLES LIKE 'character_set_server';,如果不是utf8mb4,必须改配置文件 - 编辑
/etc/my.cnf或/etc/mysql/my.cnf,在[mysqld]下加:character-set-server = utf8mb4 - 同时加上:
collation-server = utf8mb4_unicode_ci(避免后续建索引出问题) - 重启 MySQL 生效;注意:仅执行
SET GLOBAL不持久,且 Navicat 连接不会自动读取新 GLOBAL 值
Navicat 连接里设 SET NAMES utf8mb4 对这个错误无效
Unknown character set 是服务端启动阶段就注册失败的问题,发生在 SQL 解析器层面。Navicat 的「初始化命令」是在连接建立后才发的,此时 CREATE TABLE 语句早已被拒,根本轮不到执行 SET NAMES。
- 别在 Navicat 连接的「初始化命令」里填
SET NAMES utf8mb4—— 它解决不了这个报错 - 也别指望勾选「Use Unicode UTF-8」或改「MySQL 字符集」下拉框 —— 这些只影响客户端解码,不解决服务端不认识字符集的问题
- 真正要动的是服务端配置和文件系统:确保
character_sets_dir下有完整utf8mb4支持,且my.cnf显式声明character-set-server
导出端也要配合,避免把问题带到还原环节
如果源库是 MySQL 8.0+,默认 mysqldump 会写死 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci。但目标库若连 utf8mb4 本体都不支持,这些声明全是炸弹。
- 导出时强制降级兼容:
mysqldump --default-character-set=utf8 --skip-set-charset -u user -p db_name > dump.sql - 这样生成的 SQL 里只有
DEFAULT CHARSET=utf8(即 utf8mb3),虽不支持 emoji,但至少能过语法校验 - 若必须保留四字节支持,导出前先在源库执行:
ALTER DATABASE `db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;,再用--compatible=mysql57参数导出


















