navicat 17的结构同步本质是目标库ddl变更脚本生成器,非静态比对工具;差异方向取决于源/目标库设定,必须确认状态栏显示“将对目标库应用更改”,并逐项核对ddl比较面板中的collate、索引顺序、分区等细节。

结构同步不是“比对工具”,而是“变更脚本生成器”
Navicat 17 的「结构同步」本质是为**目标库生成 DDL 变更语句**,不是静态比对快照。你看到的“差异”,完全取决于哪边是源库(基准)、哪边是目标库(待修改)。选反了,ALTER TABLE 就会变成 DROP COLUMN,甚至 DROP TABLE。
关键判断依据只有顶部状态栏那行字:必须显示 将对test_old应用以下更改 才说明右侧数据库是目标库、会被动修改。如果显示的是 将对test_new应用以下更改,立刻关掉重来——别点“部署”,也别点“运行”。
建议右键数据库连接 → 「编辑连接」→ 在连接名末尾加标注,例如:【源-基准】、【目标-待升级】,避免手滑拖错顺序。
大量黄色“修改”差异,大概率只是 COLLATE 或字符集不同
两个表字段定义一模一样,Navicat 却标成“修改”,点开「DDL 比较」标签一看,往往只差一行:COLLATE utf8mb4_unicode_ci vs COLLATE utf8mb4_0900_as_cs。这种差异不影响查询逻辑,但会触发 ALTER TABLE ... CONVERT TO CHARACTER SET,可能锁表或引发隐式转换。
- 每条差异项都必须点开,到底部「DDL 比较」里逐行核对,重点盯
CHARACTER SET、COLLATE、COMMENT、ENGINE - 确认无关后,右键该行 → 「忽略此项」;Navicat 不支持批量忽略,必须一条条手动点
- 别信「忽略默认值」或「忽略列顺序」这类全局选项——它们对
COLLATE无效
索引差异藏得深,不看 DDL 比较面板根本发现不了
Navicat 把索引当整体对象比:名字不同就标“删除+新建”,字段顺序变了、前缀长度变了(如 col_b(10) vs col_b)、ASC/DESC 排序方向变了,全都不会单独列出,只在「DDL 比较」面板里暴露。
- 右键任意索引相关差异项 → 「在 DDL 比较中查看」,才能确认是不是字段顺序调换了
- MySQL 8.0+ 的函数索引(如
KEY ((UPPER(email))))必须两边写法一字不差,否则直接报不一致,且不高亮函数体差异 -
col_b(10)和col_b被视为不同字段,即使业务中没区别;Navicat 不提示“前缀长度可忽略” - 排序方向(
ASC/DESC)在 MySQL 8.0 前被忽略,但 Navicat 仍会比对并标记——这可能导致你误以为有变更,其实目标库根本不认这个语法
分区表结构差异完全不会被结构同步识别
Navicat 结构同步默认不读取 INFORMATION_SCHEMA.PARTITIONS,只依赖 TABLES 和 COLUMNS 元数据。哪怕源库是 RANGE 分区、目标库是 HASH 分区,只要字段和索引一致,它就显示“无差异”。
- 比对前必须手动执行:
SELECT PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name' - 如果任一库返回空结果,说明该表未分区;若两边行数不同、或
PARTITION_METHOD不一致,就必须中断同步,先人工统一分区策略 - Navicat 在 SQL 预览页几乎从不生成
ALTER TABLE ... ADD PARTITION、REORGANIZE PARTITION等语句,这是设计限制,不是 bug - 子分区(
SUBPARTITION)完全不支持可视化比对,只能靠SHOW CREATE TABLE文本比对
ALTER TABLE 会锁表两小时,也不会告诉你那个被忽略的函数索引在目标库根本不可用。











