Navicat导入CSV需手动映射字段:勾选“使用第一行作为字段名”并确保首行纯净,日期需逐列指定格式,大文件改用LOAD DATA INFILE或调高提交数,空值用\N表示,编码与字符集须匹配。
CSV字段顺序和表字段不一致时怎么映射
navicat默认按列位置一一对应,不是按字段名匹配。如果csv第一列是phone但数据库表第一列是id,直接导入会错乱甚至报错column count doesn't match value count。
解决方法是在导入向导第二步「字段映射」界面手动拖拽或点击下拉框选择对应字段。注意:必须点选「使用第一行作为字段名」才能让Navicat识别CSV头,否则下拉列表里看不到字段名,全是Field 1、Field 2这种占位符。
- 勾选「使用第一行作为字段名」前,先确认CSV首行确实是纯字段名(无BOM、无空格、无引号包裹)
- 如果CSV用中文字段名,目标表是MySQL且字符集为
utf8mb4,需确保Navicat连接参数里character_set_client也设为utf8mb4,否则映射下拉框可能显示乱码 - 跳过某列不导入?把该列映射目标设为
<ignore></ignore>,别留空——留空会被当成映射到第一个可用字段
处理NULL值、空字符串和默认值冲突
CSV里写NULL(纯文本)不会被识别为SQL NULL;留空单元格也不一定等于NULL,取决于字段是否允许为空、有没有默认值。
常见错误现象:Incorrect integer value: '' for column 'age' at row 1,说明CSV中某行age列为空字符串,但表定义是INT NOT NULL且没设默认值。
- 在「高级」选项卡里,勾选「空字符串转为NULL」——这仅对允许为NULL的字段生效;对
NOT NULL字段仍会触发报错 - 想让空字符串走默认值?必须取消勾选「空字符串转为NULL」,并确保数据库字段本身定义了
DEFAULT(如status TINYINT DEFAULT 0) - CSV里真要表示SQL
NULL,得写成\N(反斜杠加大写N),且需勾选「NULL值表示为」并填入\N
大CSV文件导入卡住或中断
超过10MB或10万行的CSV,Navicat默认用INSERT单条执行,容易超时、内存溢出,或被MySQL的max_allowed_packet拦截。
关键不是调大超时时间,而是切换导入模式:
- 在「高级」选项卡中,把「导入方式」从
INSERT改成LOAD DATA INFILE(前提是Navicat连接的是本地MySQL,且服务端开启了local_infile=ON) - 若用
LOAD DATA INFILE,注意CSV路径必须是MySQL服务端能访问的路径(不是你电脑上的路径),此时建议改用「从剪贴板导入」或分批导出小CSV - 实在要导大文件,先在「高级」里调高「提交记录数」到5000–10000,减少事务提交次数;同时关掉「启用外键检查」和「自动提交」,导入完再手动开
日期/时间格式不识别导致全变成0000-00-00
Navicat对日期字段(DATE、DATETIME)的解析很死板,默认只认YYYY-MM-DD和YYYY-MM-DD HH:MM:SS。CSV里写2023/05/20或20-May-2023会静默转成0000-00-00。
没有全局格式设置,只能逐字段指定:
- 在「字段映射」页,选中日期列,在右侧「格式」下拉框里选对应样式,比如
dd-MMM-yyyy对应20-May-2023 - 如果CSV用
timestamp数值(如1684567890),必须选Unix Timestamp (seconds),不能选其他时间格式 - MySQL 5.7+开启严格模式时,
0000-00-00本身就会被拒绝插入,所以务必提前校验格式,别等报错才回头改
字段映射看着简单,但CSV编码、空值逻辑、日期解析、大文件机制这几块只要有一处没对上,导入就停在某个无声无息的环节。最常被忽略的是:以为勾了「使用第一行作为字段名」就万事大吉,结果首行带BOM或者多了一个不可见空格,映射下拉框直接变灰失效。











