如何导入含大量数据且有空值列的CSV到MySQL并保留含空值的行
MySQL导入带空值CSV保留所有行的解决方案
问题本质
你遇到的导入丢行问题,是因为CSV里activated_at列的空值在默认导入规则下会被解析为空字符串,而datetime类型不支持存储空字符串,在SQL严格模式下会触发报错,最终对应行被跳过。你当前的表结构中activated_at本身已经允许为NULL,仅需调整导入时的空值处理逻辑即可。
方案1:使用LOAD DATA INFILE命令导入(适合大批量数据)
这是效率最高的导入方式,通过变量中转把空字符串转为合法NULL值即可,示例命令如下:
LOAD DATA INFILE '你的CSV文件本地绝对路径' INTO TABLE users -- 以下分隔符配置根据你的CSV实际格式调整 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS -- 如果CSV第一行是表头请保留该行,无表头则删除 -- 字段映射,将activated_at列先赋值给临时变量 (user_id, created_at, company_id, language, @tmp_activated, state) -- 空值转换:如果临时变量为空字符串,就转为NULL插入 SET activated_at = NULLIF(@tmp_activated, '');
方案2:可视化工具导入调整配置
如果使用Navicat、MySQL Workbench等可视化工具导入,可在导入向导的字段映射环节做如下调整:
- 找到
activated_at字段对应的源字段配置,修改空值处理规则,将空字符串识别为NULL - 部分工具会提供「空值插入NULL而非空字符串」的勾选选项,直接勾选即可
注意事项
- 如果你的CSV中
activated_at的空值是用字面量NULL标记的,将上述SET语句改为SET activated_at = NULLIF(@tmp_activated, 'NULL')即可 - 导入前可临时关闭严格模式避免不必要报错:执行
SET sql_mode = '';,导入完成后再恢复原有配置即可
内容的提问来源于stack exchange,提问作者Chaudhari
相关产品推荐
相关产品推荐

