Navicat的「查看表详情→DDL」页签虽基于SHOW CREATE TABLE,但存在字段顺序随机、缺失注释、外键简化等缺陷,导致diff误报;且TEXT字段可能因max_allowed_packet不足被截断,故结构同步应直接使用工具内置功能而非手动比对DDL。

直接用「工具 → 结构同步」,别试手动导DDL再文本比对——那只会被字段顺序、引号风格、TEXT截断和外键省略反复打脸。
为什么不能右键单表看DDL再diff
Navicat 的「查看表详情 → DDL」页签输出的是实时 SHOW CREATE TABLE 结果,但它有三个硬伤:字段顺序随机、不带注释、外键约束常被简化(比如漏掉 ON DELETE CASCADE)。你拿两个这样的 DDL 去 diff,哪怕逻辑完全一致,也会标出几十处“差异”。更糟的是,含 TEXT 或超宽字段的表,SHOW CREATE TABLE 可能因 max_allowed_packet 不足而截断,DDL 本身就不完整。
结构同步前必须确认的三件事
否则比对结果不可信,甚至生成错误 SQL:
- 两个库字符集必须一致,特别是
utf8mb4vsutf8—— 字符集不同会导致 Navicat 把同一列名判为“不同” - 表名大小写要统一(MySQL 在 Linux 下区分大小写),
user_table和User_Table会被当作两张表 - 脚本里若有
CREATE DATABASE或GRANT语句,导入临时库前必须删掉,Navicat 结构同步只处理表/视图/索引等对象,不认跨库语句
比对时关键选项怎么设
点「选项 → Compare Options」后,这几个开关直接影响结果质量:
- 关闭
Ignore TEXT/BLOB column attributes:否则TEXT NOT NULL和默认值全被忽略 - 关闭
Ignore column default value和Ignore column character set:要识别这些变更,这两项就不能勾 - 勾选
Ignore column order和Ignore foreign key names:避免因建表顺序或自动生成的外键名(如fk_12345)引发虚假差异
比对完看到的「要创建/删除/修改」列表,才是真实结构差异,不是文本格式差异。
ClickHouse 或其他非标数据库怎么办
Navicat Premium 17+(截至 2026 年 10 月)**不支持 ClickHouse 结构同步**,菜单里选不到连接,强行操作会报 Unsupported database type for structure synchronization。原因很实在:ClickHouse 没有稳定 SHOW CREATE TABLE 输出,也没有标准 INFORMATION_SCHEMA,ORDER BY 和 ENGINE 参数嵌套太深,Navicat 解析器根本没法映射。此时只能绕过图形界面,用 clickhouse-client --multiquery 导出建表语句,手动清理时间戳和注释后,再用 diff -u 看净变更——重点盯 ORDER BY、PARTITION BY 和 TTL 块。











