必须显式指定enclosed by '"'才能剥离双引号,否则引号被当作字段值导致日期解析报错error 1292并引发后续字段整体偏移;同时需匹配换行符(\r\n或\n)、统一utf-8无bom编码,并用@变量配合str_to_date转换。

字段被双引号包裹导致解析错位
CSV里用"包住字段(比如"2022-01-01 00:00:00")时,MySQL默认不识别这种包裹,会把引号当成字段值的一部分,后续转日期就会报Error 1292。错位往往从这里开始——字段对不上,后面全偏移。
必须显式告诉 MySQL 引号是文本限定符:
- 加
enclosed by '"',让引擎自动剥离双引号 - 不能只靠
fields terminated by ',',否则引号残留进字段值 - 如果部分字段带引号、部分不带,用
optionally enclosed by '"'更稳妥
换行符不匹配引发行级错位
Windows 生成的 CSV 默认用 \r\n 换行,Linux/macOS 下 MySQL 客户端可能只认 \n。结果就是:某行末尾的 \r 被当作文本内容吞进最后一个字段,下一行开头被截断或合并,整行数据“漂移”。
解决方式很直接:
- 查清源文件换行格式(可用
file -i filename.csv或 VS Code 状态栏查看) - 导入时强制指定
lines terminated by '\r\n'(Windows)或'\n'(Unix) - 避免依赖默认值——MySQL 的
lines terminated by默认是\n,不兼容 Windows 文件
日期/数字字段含非法字符导致截断错位
报 Warning 1265: Data truncated for column 'c1' at row 1 不只是警告,它常伴随字段错位:一旦某个 datetime 字段因引号或回车解析失败,MySQL 会跳过该字段赋值,后续字段全部左移一位,后面所有列都对不上。
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
关键预防点:
- 不用
date_format()去“格式化”原始字符串——那是输出函数;要用str_to_date(@c1, '%Y-%m-%d %H:%i:%s') - 所有需转换的字段,必须先用
@变量接收(如(@c1, c2, @c3)),再在set子句中处理 - 空值或空白字符串会导致
Error 1292,可配合if(@c1 = '', null, str_to_date(@c1, ...))做兜底
中文乱码间接造成字段错位
表面看是字段顺序乱了,实际可能是编码不一致:CSV 是 UTF-8 with BOM,而表字符集是 utf8mb4,但没在 LOAD DATA 里声明 character set utf8mb4。BOM 字节(\xEF\xBB\xBF)被当作文本开头,挤占第一个字段,后续全偏移。
务必检查并统一三处编码:
- CSV 文件本身编码(推荐 UTF-8 **without BOM**)
- 目标表字符集:
show create table t确认是utf8mb4 - 导入语句显式指定:
load data local infile 'x.csv' into table t character set utf8mb4 ...
错位问题最难调试的地方在于:它往往是多个小配置叠加的结果——引号没处理、换行符不对、又缺字符集声明。单改一处可能没用,得一起调。别只盯着 SQL 语法,先用 hexdump -C file.csv | head 看前几十字节的真实字节流,比猜更可靠。










