模型类型切换必须通过“工具→转换模型”流程,指定目标数据库类型与版本(如postgresql 15),转换后需另存为新文件,并手动修正大小写标识符及关键类型映射(如enum→domain、json→jsonb、tinyint→boolean),同步前须确认模型类型与连接的数据库类型一致。

不能“无缝”转换,模型类型切换必须走“转换模型”流程,且需人工校验类型映射与大小写规则,否则生成的 PostgreSQL DDL 会报错或语义错误。
必须用“工具 → 转换模型”,不是改连接或双击切换
Navicat 的模型(.ndm 文件)绑定的是数据库平台类型,不是靠切换左侧连接或右键修改就能变的。你看到对象导航栏里双击切库,那只影响当前连接上下文,对模型本身的物理结构定义毫无作用。
真正生效的操作路径是:工具 → 转换模型 → 明确选择目标为 PostgreSQL 15(或你实际部署的版本)→ 点击确定。
注意两点:
- 转换后原模型不会被覆盖,必须手动
另存为新文件,否则下次打开还是 MySQL 模型 - 若跳过版本指定(比如只选 PostgreSQL 不填 15),Navicat 可能按老版本规则推导
JSON或ENUM类型,导致同步时失败
转换后字段名和表名默认变小写,大写字母要加双引号
MySQL 对标识符大小写不敏感(取决于系统配置),但 PostgreSQL 默认全部转为小写,且不加引号就查不到 UserProfile 这种名字。
所以如果原 MySQL 模型里有带大写或驼峰的表/字段名,转换完必须手动处理:
- 在模型编辑器中双击表 → 进入“表属性” → 把
表名改成"UserProfile"(含双引号) - 逐个点开字段 → 在“字段属性”里把
字段名也改成带双引号形式,例如"createdAt" - 或者批量导出为 SQL 后用脚本替换,但模型内不修正,后续“同步到数据库”会直接报
relation "userprofile" does not exist
类型映射不会自动适配,enum/json/boolean 必须人工干预
Navicat 的模型转换器不理解业务语义,它只做字面映射:比如把 MySQL 的 ENUM('active','inactive') 直接转成 character varying,丢掉了约束;把 JSON 字段转成 text,而非 jsonb。
关键类型要手动改:
-
ENUM→ 删除原字段,新建domain(用 Navicat 17 的“其他 → 域”工具创建),再把字段类型设为该 domain -
JSON→ 在字段属性中将类型改为jsonb(不是json,性能差且不支持索引) -
TINYINT(1)→ 改为boolean,并确认默认值从0/1改成false/true -
DATETIME→ 改为timestamp without time zone,避免时区隐式转换
同步前必须核对两个地方:模型类型 + 当前连接的数据库类型
即使模型已转成 PostgreSQL,如果同步时选中的连接是 MySQL 类型,Navicat 会直接报错:Unsupported database type for synchronization。
每次点击 同步到数据库 前,请盯住两个位置:
- 右上角状态栏显示的当前模型类型(应为
PostgreSQL) - 左侧连接列表中,你选中的那个连接 → 右键
属性→ “常规”页里确认“数据库类型”确实是PostgreSQL
漏掉任意一个,生成的 DDL 就是 MySQL 语法,执行必炸——这不是 Navicat 的 bug,是它严格区分“模型定义”和“运行时连接”的设计逻辑。











