字段映射拖拽后不生效,主因是未点击“确定”提交、同名列/大小写/类型差异导致自动匹配静默跳过、JSON/CSV结构错乱、目标字段含空格或特殊字符、类型隐式转换失败,以及映射状态不持久。
字段映射页面拖拽后仍不生效,说明匹配逻辑被绕过
navicat 的「所有字段映射」按钮只是按列名模糊匹配,一旦源表或目标表存在同名列(如 id、created_at 在多张表里重复)、大小写混用(user_id vs user_id),或字段类型差异过大(如源是 json,目标是 varchar(255)),它就会静默跳过自动映射,回到“未映射”状态。这不是 bug,而是设计上拒绝危险猜测。
真正起作用的是你手动拖拽后的「已映射」状态——但很多人拖完没点「确定」或误点了「取消」,导致映射未提交。预览时看到的仍是初始状态。
- 进入同步向导 Step 2 → 点击「字段映射」→ 找到对应表,确认右上角显示「已自定义映射」而非「已自动映射」
- 每拖一次字段,右侧目标列旁应出现绿色对勾;若只有虚线框没对勾,说明未真正绑定
- 拖拽完成后,必须点击弹窗右下角的「确定」,而不是直接关窗口或点下一步
- 返回上一步再进一次「字段映射」,验证对勾是否还在——这是最简单的有效性检查
源 JSON 或 CSV 导入时字段顺序错乱,不能依赖「自动匹配」
从 JSON 或 CSV 导入时,字段映射 失效常因结构动态性:JSON 数组里某条记录缺字段,CSV 有空列或标题行编码异常(如 UTF-8 BOM 导致首列名变成 id),Navicat 会把第一行当标题但实际解析错位,后续全部映射偏移。
典型现象是预览数据中,email 列显示手机号,status 列显示 NULL——说明字段列索引和表结构列索引完全错开。
- 先导出前几行 JSON/CSV 做人工校验:
head -n 5 data.json或用 VS Code 查看是否含 BOM - 在 Navicat 导入向导「确认字段」页暂停,**不要点「自动匹配」**,逐个手动拖拽:左侧第 0 列 → 右侧
id,左侧第 1 列 → 右侧name…严格按位置对齐 - 对不确定是否存在的字段(如 JSON 里偶尔出现的
metadata),右侧目标列选「忽略」,避免类型强转失败 - 启用「跳过错误记录」选项(Options 标签页),防止单条脏数据中断整批
目标表字段名含空格或特殊字符,拖拽映射会断连
如果目标表用了反引号包裹的字段名,比如 `user name`、`order-date`,Navicat 字段映射界面无法识别这类标识符,拖拽后不生成对勾,甚至报「Invalid column name」——它内部把空格和短横线当分隔符处理了。
这种命名本身就不推荐,但存量系统难免存在。此时自动或手动拖拽都不可靠,必须绕过图形界面。
- 放弃「字段映射」页,在同步向导最后一步「Options」→ 勾选「生成 SQL 脚本而不执行」
- 运行后得到
INSERT INTO `table` (...) VALUES (...)脚本,用编辑器打开,手动将 VALUES 中的值顺序与目标表SHOW CREATE TABLE输出的字段顺序严格对齐 - 特别注意:含空格的字段名在 INSERT 中必须用反引号包裹,且顺序不能错,否则 MySQL 报
Column count doesn't match value count - 验证无误后,复制脚本到目标库执行,比图形界面更可控
映射生效但数据仍错位,大概率是源/目标字段类型隐式转换失败
即使拖拽成功、预览数据显示正常,同步后查目标表发现 price 全是 0、is_active 全为 NULL,问题往往出在类型强制转换:源是字符串 "1" 映射到目标 TINYINT(1),Navicat 尝试转换失败后静默填默认值,不报错也不提示。
这种错位极难排查,因为日志里没有 ERROR,只有 INFO 级别的「converted 1000 rows」。
- 在源库执行
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'your_table',记下关键字段的精确类型(如decimal(10,2)而非笼统的DECIMAL) - 对比目标表同字段的
COLUMN_TYPE,重点看精度是否一致、是否支持unsigned、zerofill等修饰符 - 若类型不兼容(如源是
datetime2(7),目标 MySQL 5.7 不支持微秒),必须在字段映射页点该列右侧铅笔图标,手动指定目标类型为DATETIME,并取消勾选「保持精度」 - 对布尔字段,SQL Server 的
bit应映射为 MySQL 的TINYINT(非BOOLEAN),否则部分版本会转成0或NULL


















