Navicat字段类型映射仅在数据传输或结构同步向导的Field Mapping页生效,需启用“Enable field type mapping”并保存;内置规则不覆盖异构组合,须手动添加TEXT→TEXT等规则,并注意驱动、大小写及手动设置优先级。
Navicat 数据迁移时字段类型映射不生效?先确认是否在「正确入口」配置
navicat 的异构表字段类型映射规则,**只在数据传输(data transfer)或结构同步(structure synchronization)向导中生效**,不是全局设置,也不会影响手动建表或 sql 执行。很多人改了「工具 → 选项 → 数据传输」里的默认映射,却发现迁移时还是把 text 强行转成 varchar(255)——因为那只是「新建传输任务时的初始模板」,真要定制,得进具体任务里重设。
实操建议:
- 启动「数据传输」后,在「源与目标」页面填完连接,点击右下角 「高级」 按钮(不是顶部菜单栏的「选项」)
- 切换到
Field Mapping标签页,这里才能为当前任务单独配置源库字段类型 → 目标库字段类型的映射规则 - 勾选
Enable field type mapping是必要前提,否则下面所有规则都不起作用 - 修改后必须点
OK保存并回到主向导,再点开始,改完不点 OK = 白调
MySQL TEXT → PostgreSQL TEXT 映射失败?注意 Navicat 内置规则优先级
Navicat 对常见数据库有预置映射表(比如 MySQL TEXT 默认映射为 SQL Server NVARCHAR(MAX)),但它**不会自动适配异构组合**。例如从 MySQL 迁到 PostgreSQL 时,TEXT 默认可能被塞进 CHARACTER VARYING(255),而不是你想要的 TEXT——因为内置规则里没这条路径,它 fallback 到了最保守的字符串长度推断逻辑。
实操建议:
- 在
Field Mapping页面,点击Add手动添加规则:源类型选TEXT,目标类型选TEXT,别依赖下拉列表的「推荐值」 - 如果源字段带长度(如
VARCHAR(500)),而目标库不支持该精度(如 PostgreSQL 的TEXT无长度限制),Navicat 可能静默忽略你的映射,此时需改用TEXT→TEXT或LONGTEXT→TEXT - 对
TINYINT(1)这类常被当布尔用的类型,MySQL → PostgreSQL 建议显式映射为BOOLEAN,否则可能变成SMALLINT,后续查起来别扭
自定义规则没生效?检查目标库驱动版本和字段名大小写敏感性
即使映射规则看起来完全正确,也可能因底层 JDBC/ODBC 驱动返回的元数据不一致而失效。典型表现是:规则写了 DATETIME → TIMESTAMP WITH TIME ZONE,但生成的目标 DDL 里仍是 TIMESTAMP。这往往不是 Navicat bug,而是 PostgreSQL 驱动把 TIMESTAMP WITH TIME ZONE 简化成了 TIMESTAMP 上报给 Navicat。
实操建议:
- 在 Navicat 连接属性里,打开
Connection Settings → Advanced,勾选Use Unicode并尝试切换Client Encoding(如设为UTF8),部分旧版 PostgreSQL 驱动依赖这个触发完整类型上报 - PostgreSQL 表名/字段名默认小写,但如果你的源库字段名含大写字母(如
CreateTime),Navicat 可能因大小写处理策略不同,导致字段匹配失败,映射规则被跳过——此时在映射规则里把源字段名写成"CreateTime"(加双引号)更稳妥 - Oracle 源库的
NUMBER(1)映射到 PostgreSQL 时,务必确认 Oracle 连接是否启用了Use Oracle ODBC Driver,否则 Navicat 可能误判为浮点型而非整型
批量迁移多个表时,如何避免每张表都手动调映射?
Navicat 不支持跨任务复用字段映射规则,也没有导入/导出规则配置的功能。所谓「批量」,本质是靠一次向导处理多张表,但映射规则仍作用于整个任务——也就是说,只要你在该任务的 Field Mapping 里配好通用规则(比如全部 TEXT → TEXT、DATETIME → TIMESTAMP),它就会统一应用到所有参与迁移的表,无需单张设置。
实操建议:
- 在数据传输向导的「表」页面,用
Ctrl+Click或Shift+Click多选表,确保它们被加入本次任务 - 然后立刻点
高级 → Field Mapping配规则,这时的配置就是这批表共用的 - 如果某几张表需要特殊处理(比如一张表的
status字段想映射为SMALLINT,其余都是INTEGER),只能拆成两个独立传输任务,分别配规则——Navicat 没有「按表覆盖映射」这种粒度
真正容易被忽略的是:字段映射只影响「自动推导的类型」,不改变你手动在「表映射」页面里已指定的目标字段名或类型。如果之前在「表映射」里双击某字段改过类型,那个手动值会覆盖掉 Field Mapping 规则。所以调规则前,最好先清空所有手动编辑过的字段类型。

















