CSV导入MySQL后数据异常,如何修复该导入问题?
解决MySQL导入CSV数据异常问题
问题重现
创建表语句
CREATE TABLE credit_facility ( id varchar(5) not null, borrower varchar(6) not null, category varchar(40) not null, purpose varchar(30) not null, committed varchar(6) not null, value_date date not null, maturity_date date not null, currency varchar(6) not null, extension varchar(2) not null, co_borrower int not null );
导入语句
SET GLOBAL local_infile=1; USE credit_facility; LOAD DATA LOCAL INFILE "/Users/lingleiqi/Desktop/test.csv" INTO TABLE credit_facility IGNORE 1 LINES;
CSV内容(多空格分隔)
id borrower category purpose committed value_date maturity_date currency extension co_borrower 1 abc credit general uncommitted 2023-11-12 2023-12-1 USD no xyz 2 efg credit general uncommitted 2023-12-10 2022-09-04 EUR no hij
异常结果与报错
执行后数据库数据异常:
id borrower category purpose committed value_date maturity_date currency extension co_borrower 1 abc 0000-00-00 0000-00-00 0 2 efg 0000-00-00 0000-00-00 0
报错信息:
1265 data truncated for column "id" at row 1 1261 row 1 doesn't contain data for all columns
错误原因
- 字段分隔符不匹配:MySQL的
LOAD DATA默认使用制表符(\t)作为字段分隔符,但目标CSV用多个空格分隔字段。MySQL无法识别多空格为分隔符,会把整行开头的连续内容(如1 abc)塞进第一个字段id,导致字段截断,后续字段因无数据填充出现空值或默认值。 - 数据类型不匹配:表中
co_borrower字段定义为INT NOT NULL,但CSV中该列的值是字符串(xyz、hij),无法转换为整数,MySQL自动将其设为0,同时触发数据截断错误。
修复步骤
步骤1:修正字段分隔符配置
在LOAD DATA语句中明确指定字段分隔符为空格,同时配置行分隔符:
SET GLOBAL local_infile=1; USE credit_facility; LOAD DATA LOCAL INFILE "/Users/lingleiqi/Desktop/test.csv" INTO TABLE credit_facility FIELDS TERMINATED BY ' ' -- 指定空格为字段分隔符,MySQL会将连续空格视为一个分隔符 OPTIONALLY ENCLOSED BY '' -- 字段无引号包裹,适配当前CSV格式 LINES TERMINATED BY '\n' -- 指定行分隔符为换行符 IGNORE 1 LINES;
如果CSV实际是制表符分隔(仅显示为多空格),则将FIELDS TERMINATED BY ' '改为FIELDS TERMINATED BY '\t'。
步骤2:修正数据类型不匹配问题
二选一即可:
- 方案A:修改表结构:将
co_borrower改为字符串类型,匹配CSV数据:ALTER TABLE credit_facility MODIFY COLUMN co_borrower VARCHAR(20) NOT NULL; - 方案B:修改CSV内容:将CSV中
co_borrower列的xyz、hij替换为合法整数值(如1、2)。
步骤3:验证导入结果
重新执行修正后的导入语句,查询表数据确认导入正常:
SELECT * FROM credit_facility;
内容的提问来源于stack exchange,提问作者LEIQI LING
相关产品推荐
相关产品推荐

