MySQL/MariaDB导入CSV时出现Data too long for column异常问题问询
MySQL导入CSV提示
Data too long for column 'incident' 问题解决方案 核心报错原因
Data too long for column 'incident' at row 1
你确认字段值长度不超过varchar(12)仍然报错,最常见的原因按概率从高到低排序:
- 默认导入配置和CSV格式不匹配:
LOAD DATA INFILE默认使用**制表符(\t)**作为字段分隔符,**换行符(\n)**作为行终止符,如果你用的CSV是逗号分隔、或者是Windows系统生成的用\r\n作为行结尾的文件,MySQL会把整行所有内容都识别为第一个incident字段的值,自然会触发长度超限错误。 - 列顺序不匹配:CSV的列顺序和
incidents表的列顺序不一致,导致其他长字段的内容被写入到incident字段。 - 存在不可见字符:
incident字段对应值前后包含空格、零宽空格、换行符、制表符等不可见字符,肉眼观察长度符合要求,实际计算长度时超过12字符限制。 - 字段包裹符未配置:如果CSV的字段用双引号/单引号包裹,没有指定
ENCLOSED BY参数的话,引号会被当成字段内容的一部分,导致长度超限。
另外你使用IGNORE参数导入成功但产生大量警告,是因为IGNORE模式会自动把超长的内容截断到字段长度上限,不会触发报错但导入的数据是被篡改的,不能正常使用。
具体解决步骤
- 明确指定CSV格式对应的导入参数
标准逗号分隔、双引号包裹字段、Linux换行的CSV,导入语句调整为:
如果是Windows生成的CSV,把LOAD DATA INFILE '/var/lib/mysql/pagerduty/script_output.csv' INTO TABLE incidents FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;LINES TERMINATED BY的值改为'\r\n'即可。 - 指定列顺序(可选,建议加上)
如果CSV的列顺序和表结构不一致,在语句末尾按CSV的列顺序填写字段名即可,例如:LOAD DATA INFILE '/var/lib/mysql/pagerduty/script_output.csv' INTO TABLE incidents FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (incident, description, status, urgency, service, trigger, team, incident_start, incident_end, resolved_by); - 排查不可见字符(如果上面两步还报错)
取出CSV第一行的incident字段值,执行以下SQL检查实际长度和字符内容:
如果存在不可见字符,先预处理CSV文件去除多余字符后再导入。-- 查看字节长度和字符长度 SELECT LENGTH('你的第一行incident字段值') 字节长度, CHAR_LENGTH('你的第一行incident字段值') 字符长度; -- 查看十六进制内容,排查是否有不可见字符 SELECT HEX('你的第一行incident字段值');
内容的提问来源于stack exchange,提问作者Sonu R
相关产品推荐
相关产品推荐

