navicat结构同步时目标表引擎被意外修改,因其默认比对并同步存储引擎;需关闭“compare storage engine”选项,并检查collation/charset比对、drop objects设置及目标库默认引擎配置,最后预览部署脚本确认无engine变更。

结构同步时为什么目标表引擎会被意外修改
Navicat 默认把存储引擎(ENGINE)当作结构定义的一部分参与比对。如果源库表用 InnoDB、目标库是 MyISAM,哪怕你只想加个字段,它也会生成 ALTER TABLE ... ENGINE=InnoDB 语句——而这类变更在生产库上可能被禁用,或引发锁表、复制延迟甚至失败。
关闭 Compare storage engine 选项
这个开关直接控制是否比对并同步引擎类型,必须手动关掉:
- 进入「结构同步」→「比对选项」标签页
- 向下滚动,找到
Compare storage engine(不同版本可能叫Compare engine type或Compare table engine) - 取消勾选该选项
关掉后,Navicat 就不会在部署脚本里生成任何 ENGINE=xxx 的 ALTER TABLE 语句,也不会因引擎不一致标红报错。
确认目标表引擎没被其他配置连带修改
即使关了引擎比对,仍有几个地方可能偷偷改引擎:
-
Compare collation和Compare charset若启用,且字符集变更触发 MySQL 自动转换引擎(极少见,但某些老版本utf8→utf8mb4会强制转InnoDB) -
Drop objects not exist in source被勾选 + 源库表已删,Navicat 可能重建表并用默认引擎(通常是InnoDB),而非保留原引擎 - 目标库的
default_storage_engine配置被修改过,导致新建表/重建表时自动套用新默认值
所以关引擎比对只是第一步,还得检查上述三项是否也按需关闭或确认无风险。
验证生成的部署脚本里真没 ENGINE 变更
别信预设,一定要点「部署脚本」→「预览」看最终 SQL:
- 搜索关键词
ENGINE=或ENGINE(注意空格) - 重点看
CREATE TABLE语句末尾和ALTER TABLE语句中间是否混入引擎声明 - 如果看到
ENGINE=InnoDB出现在 ALTER 里,说明某处开关没关严,得回头再查比对选项
最常被忽略的是:预览时发现脚本干净,但运行前不小心点了「重新比对」,而新比对又恢复了默认选项——务必在每次运行前重看一遍预览。











