Navicat显示“无差异”但SHOW CREATE TABLE实际不同,主因是Compare Options中关键选项被误勾选:Ignore TEXT/BLOB column attributes、Ignore column default value、Ignore column character set未关闭,导致TEXT字段属性、默认值、字符集等差异被跳过;同时注释空格、COLLATE隐式继承、DDL标准化差异等也造成静默漏判。

Navicat结构对比显示“无差异”,但实际SHOW CREATE TABLE输出不同——这几乎一定是比对选项关错了,不是数据库真一致。
Compare Options里关键开关被误关
Navicat默认开启多项“忽略”选项,一旦勾选,它就直接跳过比对,而非标为“不同”。常见误关项:
-
Ignore TEXT/BLOB column attributes:关掉后,TEXT字段的NOT NULL、DEFAULT、字符集才参与比对;开着时,哪怕源库content TEXT NOT NULL、目标库content TEXT,也显示“一致” -
Ignore column default value:开着时,created_at DATETIME DEFAULT CURRENT_TIMESTAMP和created_at DATETIME被视为相同 -
Ignore column character set:开着时,name VARCHAR(50) CHARACTER SET utf8mb4与name VARCHAR(50)(依赖表级默认)不会触发差异
验证方式:点「选项」→「Compare Options」,逐项确认这三项是否关闭。别信“默认值”,手动检查。
DDL解析后语义等价但原始写法不同
Navicat比的是它自己解析并标准化后的DDL,不是原始SQL字符串。这意味着:
-
TINYINT(1)和BOOLEAN在MySQL是同义,但Navicat 16默认不合并——除非你手动勾选Ignore tinyint(1) vs boolean -
VARCHAR(255)和VARCHAR(256)字段长度差1,会被标为类型变更;但INT和INT(11)在Navicat眼里是等价的 - 索引定义中
KEY idx_a (col1, col2)和KEY idx_b (col1, col2)(仅索引名不同),会被识别为“删除+新建”,但比对结果可能只显示“索引存在性一致”,细节藏在DDL比较面板里
排查动作:右键任意标为“一致”的表 →「在 DDL 比较中查看」,左右并排看Navicat生成的标准DDL,而不是原始SHOW CREATE TABLE。
字符集/排序规则差异被隐藏在“整体结构不一致”里
Navicat不会单独提示“collation不同”,而是把utf8mb4_0900_ai_ci和utf8mb4_unicode_ci的差别笼统归为“字段结构不一致”,且不展开说明。
- 必须主动勾选
Compare collations和Compare column character sets,否则这些差异直接消失 - 尤其注意TEXT/BLOB字段:即使表级字符集一致,单个TEXT字段若没显式声明
CHARACTER SET,Navicat会认为它“无字符集”,和另一端显式声明了latin1的同名字段比对失败 - 验证方法:
SHOW CREATE TABLE table_name,逐字段看是否有CHARACTER SET或COLLATE子句;缺失的,就是隐患点
注释空格、标点、不可见字符导致静默误判
Navicat对注释做精确字符串匹配,一个全角空格、一个中文顿号、甚至BOM头,都会让两个逻辑相同的表在比对中“消失”。
- 表注释
'用户表'vs'用户表 '(末尾空格)→ 不触发差异标记,但内部判定为“不同”,进而影响外键引用或同步脚本生成 - 字段注释含零宽空格(U+200B)→ Navicat无法渲染,显示为空,但比对引擎仍将其视为非空字符串,与真实空值比对失败
- 解决办法:比对前务必勾选
Ignore comments(注意:勾选=忽略),且该设置必须在点击「Compare」前完成,之后修改无效
真正容易被忽略的,是那些“没报错也没标红”的差异——它们藏在选项开关背后、藏在注释末尾、藏在TEXT字段的隐式字符集里。比对不是点一下就完事,而是要对着SHOW CREATE TABLE一行行反向验证Navicat的判断依据。











