根本原因是Navicat默认用utf8mb3连接MySQL,而Emoji需utf8mb4;须同时配置连接参数(Use Unicode UTF-8或SET NAMES utf8mb4)和导出字符集为UTF8MB4,二者缺一不可。
Navicat 备份时 Emoji 乱码或报错 Incorrect string value
根本原因是 navicat 默认用 utf8(即 utf8mb3)连接 mysql,而 emoji 需要四字节 utf-8 编码,必须走 utf8mb4。即使数据库表本身已设为 utf8mb4_unicode_ci,navicat 的连接层没配对,备份导出时仍会截断或报错。
关键不是“能不能备份”,而是“连接是否真正走 utf8mb4”。实操中常见错误:只改了表字符集,没改 Navicat 连接参数;或改了连接参数但没同步改客户端默认排序规则。
- 在 Navicat 连接属性 → “高级”页签 → 勾选
Use Unicode UTF-8(该选项实际控制的是连接时的character_set_client和character_set_connection) - 手动在“初始化命令”框中添加:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;(比勾选更可靠,能覆盖服务端默认值) - 确认 MySQL 服务端已启用
utf8mb4:检查my.cnf中collation-server = utf8mb4_unicode_ci和init_connect = 'SET NAMES utf8mb4'(后者对非 root 用户生效)
导出 SQL 文件时 Emoji 被替换成问号或空格
这是 Navicat 导出器内部编码处理不一致导致的——即使连接正确,导出模块可能仍按旧逻辑处理字符串。不能依赖“自动检测”,必须显式指定。
- 导出前右键数据库/表 → “转储 SQL 文件” → “高级”选项卡 → 在
Character set下拉菜单中**手动选择UTF8MB4**(注意不是UTF8,也不是留空) - 避免使用“快速导出”模式,选“自定义导出”,勾选
Export data并确保Insert statement格式(它比Load data infile更可控字符编码) - 若导出后仍有
?,打开生成的 SQL 文件,搜索SET NAMES开头的行,确认其值是utf8mb4;如果不是,说明导出过程绕过了你设的连接参数,此时应改用命令行mysqldump --default-character-set=utf8mb4做基准验证
还原备份时提示 Unknown character set: 'utf8mb4'
这通常发生在目标 MySQL 版本低于 5.5.3,或者服务端未启用 utf8mb4 支持。Navicat 备份文件里会包含 CHARACTER SET = utf8mb4 这类语句,老版本直接报错。
- 先执行
SELECT VERSION();确认目标库版本 ≥ 5.5.3;低于则必须升级或改用其他方案(如把 Emoji 转义为 JSON 字符串暂存) - 检查目标库是否支持:
SHOW CHARSET LIKE 'utf8mb4';应返回一行;若无结果,需重启 MySQL 并确保my.cnf中有character-set-server = utf8mb4 - 如果只是临时还原测试,可在 Navicat 执行 SQL 文件前,手动删掉文件开头所有
CREATE TABLE ... DEFAULT CHARSET=utf8mb4中的DEFAULT CHARSET=utf8mb4,并把COLLATE=utf8mb4_unicode_ci换成COLLATE=utf8_unicode_ci(仅限不含 Emoji 的字段)
备份大表含长文本 + Emoji 时超时或内存溢出
Navicat 默认导出是单事务、全内存缓存整张表再写入磁盘,遇到 TEXT + Emoji 组合极易触发 OOM 或连接中断。这不是字符集问题,而是导出策略问题。
- 在“转储 SQL 文件”→“高级”中,**取消勾选
Extended insert**(即不用一条 INSERT 插多行),改为每行一条INSERT,降低单语句长度和内存压力 - 勾选
Split file by table或Split file by size(建议 20–50 MB),避免单文件过大导致编辑/传输困难 - 对超大表(>100 万行),优先考虑用
mysqldump --single-transaction --skip-triggers --no-create-info --where="1=1"分批导出,Navicat 不适合这种场景
真正容易被忽略的点是:Navicat 的“连接字符集”和“导出字符集”是两个独立开关,且后者在每次导出对话框里都会重置为默认值。哪怕你上周刚配好,这次点“转储”时仍要手动再选一次 UTF8MB4。











