MySQL导入CSV遇[1411]错误:STR_TO_DATE传入空日期值
解决STR_TO_DATE处理空值报错的问题
错误原因是CSV中存在空的日期字段(值为''),而STR_TO_DATE函数无法将空字符串转换为有效的日期类型,触发了1411错误。可以通过以下方式修复:
1. 直接处理空值,转换为NULL
修改SET子句中的DateAdded赋值逻辑,先判断日期变量是否为空,为空则设为NULL(前提是表中DateAdded字段允许NULL):
SET shows.ShowID =@ShowID , shows.TypeID = (select TypeID from typecountry t where t.`Type`=@type1 and t.Country=@country), shows.DateAdded= STR_TO_DATE(IF(@date_added = '', NULL, @date_added), '%e-%b-%y');
2. 若DateAdded不允许NULL,设置默认值
如果DateAdded字段定义为NOT NULL,可以给空值设置一个合法的默认日期(比如'0000-00-00'或当前日期),示例:
shows.DateAdded= STR_TO_DATE(IF(@date_added = '', '01-Jan-00', @date_added), '%e-%b-%y');
注意:如果使用'0000-00-00',需要确保MySQL的sql_mode未启用NO_ZERO_DATE和NO_ZERO_IN_DATE,否则会触发新的错误。
3. 排查CSV中的异常数据
如果除了空值还有其他格式错误的日期值,可以先将数据导入临时表,筛选出不符合格式的行进行修正:
-- 创建临时表 CREATE TEMPORARY TABLE temp_shows LIKE shows; -- 导入所有数据(不处理日期转换) LOAD DATA INFILE 'your_file.csv' INTO TABLE temp_shows FIELDS TERMINATED BY ',' optionally enclosed by '"' LINES TERMINATED BY '\r\n' IGNORE 1 ROWS; -- 筛选出DateAdded为空或格式错误的行 SELECT * FROM temp_shows WHERE DateAdded = '' OR STR_TO_DATE(DateAdded, '%e-%b-%y') IS NULL;
修正这些异常数据后,再正式导入到目标表。
内容的提问来源于stack exchange,提问作者Damjan Mijakovski
相关产品推荐
相关产品推荐

