navicat数据同步中文乱码主因是字符集未统一,需同步前锁定源库连接、目标库连接及同步任务上下文均为utf8mb4;须检查库、表、字段三级字符集与校对规则一致,并确保连接设置后断开重连生效。

Navicat 数据同步后中文乱码,不是同步过程“改坏了数据”,而是同步时跳过了字符集协商——源库和目标库的字符集不一致,或连接层未强制设为 utf8mb4,导致字节被错误解码。必须在同步前就锁死三处编码:源库连接、目标库连接、同步任务本身的字符集上下文。
同步前必须确认源库与目标库的字符集完全一致
同步工具不会自动转换字符集,它只按字节原样搬运。如果源表是 utf8mb4,目标表是 latin1,同步完立刻乱码。
- 分别连上源库和目标库,执行:
SHOW CREATE DATABASE your_db;,确认两库都带CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 再查表:
SHOW CREATE TABLE your_table;,重点看末尾的DEFAULT CHARSET=和COLLATE=是否一致 - 字段级也不能漏:
SHOW FULL COLUMNS FROM your_table;,检查每列的Collation值是否全为utf8mb4_unicode_ci(不是utf8_general_ci或空) - 若发现不一致,先在目标库执行:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;,TEXT 类型字段需额外MODIFY
Navicat 同步任务里没有字符集选项,靠连接层兜底
Navicat 的「数据同步」功能本身不提供字符集下拉框,它完全复用你配置的源连接和目标连接的初始化设置。一旦连接没设对,同步就是错的。
- 右键源库连接 →「编辑连接」→「高级」→「MySQL 字符集」选
utf8mb4(不是utf8,也不是UTF-8) - 勾选「使用初始化命令」,填入:
SET NAMES utf8mb4; - 目标库连接做同样设置——两个连接必须一模一样,否则同步时客户端用一种编码读,用另一种编码写
- 改完必须断开重连,再进「数据同步」向导,预览窗口里中文能正常显示,才说明连接层生效了
同步完成后查表仍是问号?立刻检查会话变量
即使同步界面预览正常,最终 SELECT 出来是问号,说明当前查询窗口的连接上下文没继承同步时的初始化设置——它走的是默认连接逻辑。
- 同步完不要直接在同步窗口点「查询」,新开一个普通查询窗口
- 执行:
SELECT @@character_set_client, @@character_set_connection, @@character_set_results; - 三个值必须全是
utf8mb4;如果其中一个是latin1,说明你刚改的连接设置没生效,得回头检查「高级」页签是否误关、拼写是否多空格 - 此时别急着重同步,先手动在该窗口执行:
SET NAMES utf8mb4;,再查表验证——这能帮你快速定位是连接配置问题还是数据已损坏
最容易被忽略的一点:同步任务启动后,Navicat 会新建独立连接执行搬运,它不继承你当前活动查询窗口的 SET 命令。所以「连接属性里设了 utf8mb4」和「同步任务真用了 utf8mb4」之间,隔着一次重新连接的动作。没重连,等于没设。











