MySQL LOAD DATA INFILE导入CSV日期格式转换失败问题求助
问题描述
使用LOAD DATA INFILE导入预定义位置的CSV文件时,其他字段均可正常导入,但日期字段dob始终报错。移除日期字段后导入可成功,且单独使用DATE_FORMAT(STR_TO_DATE(...))语法执行UPDATE操作也能正常转换日期,但将该逻辑放到LOAD DATA INFILE语句中就抛出日期格式错误。
错误执行的SQL语句:
LOAD DATA INFILE '/var/lib/mysql-files/subjects_subject.csv' INTO TABLE subjects_subject FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (id,assigned_id,first_name,last_name,middle_name,dob,MRN,Gender,active,institution_id,dod) set dob = DATE_FORMAT(STR_TO_DATE(@dob, '%m/%d/%Y'),'%Y-%m-%d');
错误提示:
ERROR 1292 (22007): Incorrect date value: '10/10/1996' for column 'dob' at row 1
CSV数据示例:
0,TEST00003,Firstname,Lastname,NULL,6/4/2004,#######,F,1,1,NULL
解决方法
- 问题核心:当前语句的执行顺序错误——先将CSV中的
dob原始值直接写入表的dob字段(此时MySQL会按默认日期格式校验,因原始格式不匹配触发报错),之后才执行set进行格式转换,这一步已经晚了。 - 修正后的SQL语句:把字段列表中的
dob替换为用户变量@dob,先将CSV中的日期值暂存到变量里,再通过set转换后赋值给表的dob字段;同时处理dod字段(CSV中为NULL字符串):
LOAD DATA INFILE '/var/lib/mysql-files/subjects_subject.csv' INTO TABLE subjects_subject FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS (id,assigned_id,first_name,last_name,middle_name,@dob,MRN,Gender,active,institution_id,@dod) set dob = STR_TO_DATE(@dob, '%m/%d/%Y'), dod = CASE WHEN @dod IS NOT NULL AND @dod != 'NULL' THEN STR_TO_DATE(@dod, '%m/%d/%Y') ELSE NULL END;
- 额外说明:
- 无需使用
DATE_FORMAT,因为STR_TO_DATE返回的已经是MySQL兼容的DATE类型,可直接赋值给日期字段。 - 针对
dod字段,CSV中是NULL字符串,需要先判断再转换,避免空字符串触发日期格式错误。 - 若你的MySQL sql_mode包含
NO_ZERO_DATE或STRICT_TRANS_TABLES,需确保转换后的日期为合法有效日期(如避免0000-00-00这类无效值)。
- 无需使用
内容的提问来源于stack exchange,提问作者user4966711
相关产品推荐
相关产品推荐

