必须用「结构同步」生成差异脚本,而非右键复制单表DDL——因后者字段/索引/约束顺序随机、省略COMMENT及ON DELETE CASCADE等外键细节、TINYINT(1)与BOOLEAN被误判为不同、引号格式('2023' vs "2023")触发语义误标,且大表易因max_allowed_packet截断导致DDL缺失;而结构同步通过可控比对逻辑(如关闭Ignore TEXT/BLOB、默认值、字符集选项,勾选忽略列序和外键名)输出稳定、语义准确、可被Git有效追踪的差异SQL。
必须用「结构同步」生成差异脚本,而不是右键导出或复制单表 ddl —— 后者无法保证顺序、语义一致性与可 diff 性。
为什么不能右键表 →「DDL」页签直接复制
这个 DDL 是实时快照,不带 COMMENT、可能省略 ON DELETE CASCADE 等外键细节,且字段/索引顺序随机。Git diff 时哪怕只是列顺序调换,整段 CREATE TABLE 就全标红,失去版本追踪意义。更严重的是:SHOW CREATE TABLE 在大表上可能因 max_allowed_packet 截断,导致 DDL 缺失 TEXT 字段定义或默认值。
- 字段名顺序、索引定义顺序、约束声明顺序都不稳定
-
TINYINT(1)和BOOLEAN被当不同类型处理,实际等价却报差异 - 默认值字符串用单引号还是双引号(
'2023'vs"2023")也触发误判
正确路径:工具 → 结构同步 → 输出可提交的差异 SQL
这是唯一能产出稳定、语义准确、可被 Git 有效比对的 DDL 脚本的方式。关键不在“生成”,而在“控制比对逻辑”:
- 左侧选开发库(源),右侧选目标库(如测试/生产)——顺序反了,脚本就是反向覆盖
- 在「选项」→「Compare Options」中关闭:
Ignore TEXT/BLOB column attributes(否则 NOT NULL、默认值全丢失) - 务必关闭:
Ignore column default value和Ignore column character set,否则字符集升级或默认值变更根本检不出 - 勾选:
Ignore column order和Ignore foreign key names,避免因建表顺序或自动生成的fk_12345名引发虚假差异
导出前必须显式设置 utf8mb4 并禁用数据插入
Navicat 默认可能沿用源库编码或留空,导致脚本在目标环境执行时报 Unknown character set 'utf8mb3';同时,默认勾选「Insert records」会混入 INSERT,污染初始化脚本。
覆盖宏观策略、固收研究、行业公司深度分析、量化因子、大类资产配置、可转债、市场情绪、政策快评、行业景气度追踪等34项核心研究能力,证券研究员的全能数字助手。
- 在「导出向导」→「高级」页,
Character set必须手动选utf8mb4(不是utf8,也不是自动) - 取消勾选
Insert records;Navicat 15+ 版本第一步就有「仅结构」单选按钮,优先用它 - 勾选
Export with CREATE DATABASE,避免团队执行时因库不存在而中断 - MySQL 5.7 以下环境,取消勾选
Generate DROP statements,否则DROP DATABASE IF EXISTS语法不支持
Git 提交前检查三行“隐形头信息”
Navicat 导出的 SQL 开头常含注释或 SET 语句,例如 -- Host: localhost Database: myapp 或 SET NAMES utf8mb4;。这些看似无害,但某些 CI/CD 工具或 MySQL 客户端会静默失败,或让 Git diff 因时间戳/主机名变动而失效。
- 打开导出文件,删掉开头所有非
CREATE/ALTER/COMMENT的行 - 确认第一行是
CREATE DATABASE或USE `xxx`;,而非--注释或SET - 若用 Navicat Data Modeler,模型文件(
.ndm)可被 Git 直接跟踪,且支持图形化Compare with Previous Version
真正决定脚本能进 Git 的,不是格式多漂亮,而是每次导出是否产生相同哈希值。只要顺序、默认值写法、字符集声明、外键语法全部可控,diff 才有意义。否则,所谓版本控制只是把一堆不可靠快照扔进仓库。

















