Navicat 不支持直接修改模型的 database type 属性,必须使用“转换模型向导”进行语义重写;数据迁移应使用“数据传输”功能而非导入SQL;国产数据库需特别配置驱动、SQL模式及系统参数。
Navicat 不支持直接修改模型的 database type 属性
你不能右键一个已存在的 mysql 模型 → “属性” → 把 database type 下拉框改成 oracle 就认为转换完成了。这种操作只是改了个标签,底层字段类型、约束语法、主键生成逻辑全都没变,后续同步或导出时必然报错,比如:unsupported data type mapping 或生成含 engine=innodb 的 oracle ddl。
根本原因在于:Navicat 模型是语义绑定的——INT(11)、AUTO_INCREMENT 是 MySQL 专属;NUMBER(10,0)、SEQUENCE、GENERATED ALWAYS AS IDENTITY 是 Oracle 专属。模型内部存储的是带上下文的元数据,不是可自由编辑的配置项。
强行编辑 .ndm 文件或用外部工具硬改,会导致:
- 同步到目标库时报
Invalid object definition - 逆向工程失败,比对功能完全不可用
- 外键级联行为、索引选项丢失或错配
必须用“转换模型向导”新建目标平台模型
正确路径只有一条:通过官方转换流程触发语义重写,让 Navicat 基于内置映射规则重建结构。操作步骤很明确:
- 在工作区中右键原模型 → 选择
转换模型向导(不是“属性”,也不是“同步到数据库”) - 目标模型类型选
物理模型(若原模型已是物理模型,此项跳过) - 目标数据库选具体类型和版本,例如
Oracle 19c(不同版本对JSON、XMLTYPE支持差异大,不能笼统选 Oracle) - 勾选要转换的图表(务必包含关联视图、索引、外键约束,否则会漏)
- 点击转换 → Navicat 会生成一个全新的独立模型文件,原模型不受影响
注意:转换后必须人工核对三类关键项:
- 主键生成方式:
AUTO_INCREMENT→SEQUENCE + TRIGGER或IDENTITY(Oracle 12c+) - 大文本类型映射:
MEDIUMTEXT→CLOB,LONGBLOB→BLOB - 默认值语法:
CURRENT_TIMESTAMP→SYSTIMESTAMP,0默认值在 Oracle 中需显式写为0而非空字符串
数据迁移要用“数据传输”而非“导入 SQL 文件”
很多人习惯先导出 SQL 脚本再手动改表名、删外键、清目标表,这条路在跨平台场景下极易翻车。比如 Oracle 的 DATE 类型精度是秒级,MySQL 的 DATETIME 默认不带毫秒,直接执行脚本会导致截断甚至报错;又比如 MSSQL 的 NVARCHAR(MAX) 导出为 nvarchar(max),PostgreSQL 并不识别这个写法。
数据传输 功能才是专为异构迁移设计的核心模块,它会在运行时做实时类型映射和值转换。启用前必须确认:
- 源库连接字符串中显式声明编码,如 MSSQL 加
;charset=utf8,避免中文乱码 - PostgreSQL 目标端
postgresql.conf中server_encoding设为UTF8,且client_encoding允许兼容 - 在数据传输设置里勾选
使用扩展插入语句(提升大批量性能),并根据网络稳定性调高超时时间(如从 30 秒改为 120 秒) - 对于超大表(>500 万行),禁用
事务提交所有记录,改用分批提交(如每 10000 行提交一次)
传输过程中若报 value too long for type character varying(255),说明 Navicat 自动映射的长度不够,需回到模型中手动调整目标字段长度,再重新传输该表。
国产数据库(达梦、人大金仓)有特殊适配要求
Navicat Premium 自 2025 年起支持达梦 DM8、人大金仓 KingbaseES V8,但不是“选中就通”。这些库的 SQL 方言和系统表结构与主流开源/商业库差异明显,容易踩坑:
- 达梦的序列语法是
CREATE SEQUENCE seq START WITH 1 INCREMENT BY 1,不支持IDENTITY,转换后需检查主键是否被映射为手工触发序列 - 人大金仓的
TEXT类型实际等价于 PostgreSQL 的TEXT,但其默认排序规则(collation)不兼容 UTF8,需在目标库执行ALTER DATABASE xxx SET lc_collate = 'C' - 连接达梦时必须使用 JDBC 驱动(
dmjdbcdriver18.jar),且 Navicat 版本 ≥ v17,v16 及以下无法识别 DM8 新增的 JSON 函数 - 转换模型后,务必用
同步模型到数据库功能验证 DDL 是否能真正执行成功,不要只看预览
最常被忽略的一点:国产库通常关闭了部分标准 SQL 模式(如 ANSI_QUOTES),而 Navicat 在生成 DDL 时默认按标准模式输出双引号标识符。如果目标库没开该模式,同步会直接失败,必须提前在目标库执行 SET SESSION sql_mode = 'ANSI_QUOTES' 或手动修改模型中对象名称的引号风格。











