Python通过LOAD DATA INFILE导入CSV至MySQL时数据截断、外键关联异常
问题根源与修复方案
核心异常原因
两个核心问题均由LOAD DATA配置与CSV文件格式不匹配导致,和表结构、手动插入逻辑无关。之前同配置在其他表使用正常,是因为那些场景下的CSV文件换行格式和语句配置刚好匹配,本次导入的CSV换行格式与配置不兼容,才触发了异常:
- 外键关联失败的原因:导入的
uid字段末尾携带了不可见的回车符\r
你当前的CSV文件大概率为Windows环境生成,行结束标识为\r\n(回车+换行),但语句中仅指定了LINES TERMINATED BY '\n',导致每行末尾的\r没有被识别为行结束符,而是被拼接在最后一个字段(也就是uid)的末尾。虽然终端输出时\r会将光标移到行首,视觉上看不到差异,但实际存储的uid比手动插入的合法值多了1个字节的不可见字符,外键匹配时因为字符串不完全相等,自然会提示ID不存在。同时这个不可见字符也是查询结果排版错乱的诱因。 - person字段被截断的原因:行结束符识别错误导致字段边界被错误切分
除了Windows换行的问题,你在Python字符串中写的'\\n'存在转义错误:普通Python字符串中\\n会被解析为「反斜杠+n」两个字面字符,而非实际的换行符(ASCII 10)。这导致MySQL收到的行结束标识完全错误,无法正确拆分每行数据,只能按照错误的边界把连续的字节流切片,最终就出现了person字段开头被随机截断、导入后行顺序错乱的现象。
修复步骤
- 修正Python代码中的转义问题
行结束符的配置不要写'\\n',直接写'\n'即可——Python会自动将其转义为正确的换行符值传给MySQL。如果确认CSV是Windows格式生成的,直接将行结束符指定为'\r\n':mycursor.execute('''LOAD DATA INFILE 'data_aux.csv' INTO TABLE aux FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' IGNORE 1 ROWS;''') - 移除不必要的双引号包裹配置
你的CSV中所有字段都没有被双引号包裹,原语句中的ENCLOSED BY '"'属于冗余配置,移除后可以避免MySQL错误识别字段边界。 - 导入后校验数据正确性
不要仅依赖终端输出的视觉效果判断结果,导入完成后执行长度校验,确认字段没有携带不可见字符:
对比每个字段的长度和原始CSV中的字符串长度,确保没有多余/缺失的字符,再进行外键关联测试。SELECT person, LENGTH(person), uid, LENGTH(uid) FROM aux;
内容的提问来源于stack exchange,提问作者Dastru
相关产品推荐
相关产品推荐

