MySQL加载CSV文件时触发错误码1292(Incorrect Datetime Value)的问题
解决LOAD DATA导入CSV时DATETIME/TIMESTAMP空值触发1292错误的问题
这个问题我之前也踩过坑——明明给date_created字段设了CURRENT_TIMESTAMP默认值,CSV里该列是空的,导入却报错1292 Incorrect Datetime Value。核心原因是MySQL默认开启的严格模式会拒绝无效日期值,而且LOAD DATA不会自动用字段默认值替换空字符串,下面给你几个实用的解决办法:
方法1:在LOAD DATA语句中显式处理空值(推荐)
直接在导入逻辑里判断,如果CSV中的date_created列是空字符串,就用字段默认值填充,否则用CSV里的原始值。示例代码如下:
LOAD DATA INFILE '/path/to/your/data.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' -- 根据你的CSV实际格式调整分隔符和包围符 LINES TERMINATED BY '\n' IGNORE 1 LINES -- 如果CSV包含表头,加上这行跳过表头 (col1, col2, @temp_date) -- 用临时变量接收CSV中的空值 SET date_created = IF(@temp_date = '', DEFAULT(date_created), @temp_date);
这种方法最稳妥,不会影响全局SQL模式,精准处理目标字段的空值问题。
方法2:临时关闭严格模式(应急场景)
如果只是临时导入数据,不想修改导入语句,可以先关闭严格模式,导入完成后再恢复:
- 先查看当前的SQL模式:
SELECT @@sql_mode;
- 临时移除严格模式:
SET sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');
- 执行你的
LOAD DATA导入语句 - 恢复原来的SQL模式(把第一步查到的完整值复制回来):
SET sql_mode = '你的原始sql_mode值';
⚠️ 注意:这种方法会降低MySQL的数据校验严格性,可能导致其他无效数据被插入,只适合临时应急使用。
方法3:调整表结构(结合业务场景)
如果业务允许date_created字段为NULL,可以修改表结构,让字段允许NULL并保留默认值:
ALTER TABLE your_table MODIFY COLUMN date_created DATETIME DEFAULT CURRENT_TIMESTAMP NULL;
不过要注意:MySQL中插入NULL到该字段会自动用CURRENT_TIMESTAMP填充,但如果CSV里是空字符串'',还是会触发错误——所以这种方法最好配合方法1,或者先把CSV里的空值替换成NULL再导入。
内容的提问来源于stack exchange,提问作者Pete Watters Chatsworth
相关产品推荐
相关产品推荐

