You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MySQL JDBC导入CSV至MySQL表时出现数据截断错误求助

解决MySQL导入CSV时的Data Truncation日期错误

这个问题我之前帮不少开发者排查过,核心原因是你表中startYear列的数据类型和CSV里的纯年份格式不兼容,咱们一步步拆解解决:

问题根源

从你的错误信息和示例数据来看:

  • 你把startYear列定义成了DATE类型(MySQL期望YYYY-MM-DD格式的完整日期),但CSV里只给了四位年份1894,不符合DATE的格式要求,触发了数据截断错误。
  • 另外示例里的endYear是0000,如果这列也是DATE类型,同样会踩坑——MySQL在严格模式下不允许0000-00-00这类无效日期。

针对性解决方案

方案1:修改表结构为INT类型(最推荐)

既然你的数据里存储的只是年份数值,完全没必要用DATE类型,直接改成INT更贴合需求:

ALTER TABLE your_table_name MODIFY COLUMN startYear INT;
ALTER TABLE your_table_name MODIFY COLUMN endYear INT;

修改后,CSV里的1894、0000都能直接导入,不会有任何格式问题。

方案2:保留DATE类型,在导入时转换格式

如果业务必须要求DATE类型,可以在LOAD DATA命令中通过变量和函数把纯年份转换成合法日期(比如默认当年1月1日):

LOAD DATA LOCAL INFILE 'your_file.csv'
INTO TABLE your_table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES -- 如果CSV第一行是表头,记得加上这句跳过
(tconst_titles, titleType, primaryTitle, originalTitle, isAdult, @startYear, @endYear, runtimeMinutes)
SET 
  startYear = STR_TO_DATE(CONCAT(@startYear, '-01-01'), '%Y-%m-%d'),
  endYear = CASE 
              WHEN @endYear = '0000' THEN NULL -- 把无效的0000转为NULL(需确保列允许空值)
              ELSE STR_TO_DATE(CONCAT(@endYear, '-01-01'), '%Y-%m-%d') 
            END;

这里先用用户变量@startYear读取CSV里的原始值,再通过CONCAT拼接成YYYY-01-01的合法格式,最后用STR_TO_DATE转换成DATE类型。

方案3:临时调整SQL模式(不推荐)

如果你只是临时导入数据,不想改表或转换格式,可以临时关闭MySQL的严格日期校验模式,但这种方法会导致数据不规范,后续查询容易出问题:

SET sql_mode = 'NO_ENGINE_SUBSTITUTION';

导入完成后记得改回原来的SQL模式,避免影响其他业务。

额外注意事项

  • 确认CSV的字段分隔符是逗号,和LOAD DATA里的FIELDS TERMINATED BY ','一致;
  • 如果CSV第一行是表头,一定要加IGNORE 1 LINES跳过,否则表头内容会被当作数据导入,也会触发错误;
  • 检查isAdult列的数据类型,如果是INT或BOOL,CSV里的0是完全合法的,不用调整。

内容的提问来源于stack exchange,提问作者user8929822

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:04:40