使用LOAD DATA LOCAL INFILE导入CSV时日期字段为NULL的问题
解决LOAD DATA导入CSV日期字段为NULL的问题
看起来你遇到的问题主要有两个关键点,我们一步步拆解解决:
1. 格式字符串的语法错误
先看你处理date_added的语句:
date_added = str_to_date(@column17, '%d/%m/%Y %H:%:%i:%s')
这里的格式字符串多了一个多余的冒号——%H:%:%i:%s应该修正为%H:%i:%s,多余的冒号会让STR_TO_DATE无法匹配你的日期格式,直接返回NULL。
2. LOAD DATA的变量映射缺失
你的原始语句里,在INTO TABLE db_table之后没有指定CSV列到变量/表字段的映射关系,这会导致@column7、@column8、@column17这些变量根本没有被赋值,自然转换出来的结果全是NULL。
正确的语句示例
假设你的CSV总共有17列,且表中其他非日期字段可以直接对应CSV列,那么正确的语句应该是这样的:
LOAD DATA LOCAL INFILE '/file.csv' INTO TABLE db_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES -- 先把CSV每一列对应到表字段或@变量,第7、8、17列暂存到变量用于后续转换 (col1, col2, col3, col4, col5, col6, @column7, @column8, col9, col10, col11, col12, col13, col14, col15, col16, @column17) SET promotion_starts = STR_TO_DATE(@column7, '%d/%m/%Y %H:%i:%s'), promotion_ends = STR_TO_DATE(@column8, '%d/%m/%Y %H:%i:%s'), date_added = STR_TO_DATE(@column17, '%d/%m/%Y %H:%i:%s');
额外验证步骤
你可以先单独测试STR_TO_DATE函数是否能正确转换你的日期格式:
SELECT STR_TO_DATE('27/05/2019 20:25:00', '%d/%m/%Y %H:%i:%s');
如果这个查询返回正确的DATETIME值,说明格式字符串没问题,剩下的就是确保LOAD DATA时变量被正确赋值。
另外还要确认你的表中promotion_starts、promotion_ends、date_added这三个字段的类型是DATETIME或TIMESTAMP,这样才能存储转换后的日期值。
内容的提问来源于stack exchange,提问作者futureweb
相关产品推荐
相关产品推荐

