应取消勾选「使用第一行作为字段名」,使Navicat将CSV所有行(含首行)视为纯数据导入;若需字段映射,可临时添加与目标表字段名完全一致的假表头并启用该选项。
Navicat 导入 CSV 时首行被当数据,不是表头怎么办
navicat 默认把 csv 文件第一行(索引 0)当作字段名,但如果你的 csv 实际没有表头,这一行就会被错误识别为列名,导致后续所有数据行整体上移、字段错位、not null 报错。这不是文件损坏,是 navicat 按 rfc 规范严格解析的结果——它不会自动探测“这行像不像标题”,只认你明确告诉它的位置。
在导入向导里把“字段名所在行”设成 0 就能解决?
不能。设成 0 是默认行为,等于没改。你要的是**跳过表头识别**,而不是强化它。真正有效的操作是:取消勾选「使用第一行作为字段名」。这个选项一旦关闭,Navicat 就不再尝试提取任何一行作列名,而是按纯数据流处理,从第 0 行开始全当数据导入。
- 如果 CSV 真有表头,但你误关了该选项,结果会生成
Field 1、Field 2这类占位列名,映射时看不到真实字段名 - 如果 CSV 没表头,却勾选了该选项,Navicat 会强行把第一行塞进目标字段(比如把 "张三" 塞进
id自增列),直接触发主键冲突或类型报错 - 勾选状态必须在「导入向导」第 1 步就确认,进到第 2 步「字段映射」时再改已无效
CSV 没表头但又想按字段名映射,怎么绕过?
可以临时加一行假表头,再启用名称映射。这不是取巧,而是利用 Navicat 的设计逻辑:它只校验“有没有启用药名匹配”,不校验“名字对不对”。操作很简单:
- 用 Notepad++ 或 VS Code 打开 CSV,在最顶部插入一行,例如:
id,name,phone,email - 确保这行是纯文本,无 BOM、无多余空格、无中文引号
- 导入时勾选「使用第一行作为字段名」,然后在第 2 步「字段映射」中拖拽或下拉选择对应目标字段
- 导入完成后删掉那行假表头(如果需要保留原始文件,另存一份即可)
注意:假表头里的名字必须和数据库表字段名完全一致(大小写敏感取决于数据库配置),否则映射下拉框里找不到对应项。
为什么不用 skiprows=1 或 header=1 这类参数?
因为 Navicat 图形界面不暴露这些底层参数。你看到的「字段名所在行」输入框,本质就是 header 参数的 UI 映射,但它只在「使用第一行作为字段名」启用时才生效;禁用后该输入框变灰不可用。试图填 1 或 -1 都会被忽略或重置。真正的控制权只在那个复选框上——它开,Navicat 才读 header;它关,Navicat 就当整份文件是裸数据流。
复杂点在于:同一份 CSV,可能在 Excel 里看着像有表头(其实是加粗+居中),但在 Navicat 里必须靠显式开关来定义语义。别依赖视觉判断,只信那个复选框的状态。


















