使用LOAD DATA LOCAL时首列日期首行存为0000-00-00 00:00:00问题排查
MySQL LOAD DATA LOCAL首行日期导入异常问题分析
问题现象
当使用MySQL的LOAD DATA LOCAL语句导入CSV数据时,若日期列为首列,仅首行的日期会被存储为0000-00-00 00:00:00,其余行日期导入正常;若将字符串列作为首列则无此异常。当前使用的MySQL版本为8.0.30-0ubuntu0.20.04.2。
测试案例
案例A:日期列为首列
- CSV文件前两行内容:
2022-01-31,hello_world 2022-01-31,hello_stackover
- 导入后MySQL表中数据:
0000-00-00 00:00:00,hello_world 2022-01-31 00:00:00,hello_stackover
案例B:字符串列为首列
- CSV文件前两行内容:
hello_world,2022-01-31 hello_stackover,2022-01-31
- 导入后MySQL表中数据:
hello_world,2022-01-31 00:00:00 hello_stackover,2022-01-31 00:00:00
使用的SQL语句
LOAD DATA LOCAL INFILE 'myfile.csv' INTO TABLE mydatabase.`mytable` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' (my_date, any_string_column);
异常原因
最可能的原因是CSV文件首行开头存在UTF-8 BOM(字节顺序标记)。BOM是一种不可见的特殊字符(十六进制为EF BB BF),当它出现在日期列的开头时,会导致日期字符串变为\ufeff2022-01-31,MySQL无法识别这种不符合日期格式的内容,因此将其转换为无效的0000-00-00 00:00:00。
而当字符串列为首列时,BOM会被包含在字符串字段中,MySQL可以正常存储带特殊字符的字符串,不会影响后续日期列的解析,因此不会出现异常。
解决方法:用文本编辑器(如Notepad++)打开CSV文件,选择“编码”→“UTF-8无BOM格式”保存,或者用十六进制编辑器直接删除开头的BOM字符后重新导入。
内容的提问来源于stack exchange,提问作者Kaspatoo
相关产品推荐
相关产品推荐

