LOAD DATA导入CSV时文本字段逗号保留数值字段被截断原因
问题原因及解决方案
核心原因
这个差异是CSV字段拆分规则和MySQL不同字段类型的解析逻辑共同导致的:
- 你使用的导入语句指定了
FIELDS TERMINATED BY ',',同时开启了OPTIONALLY ENCLOSED BY '"',只有被双引号包裹的内容里的逗号才会被识别为字段值的一部分,不会作为字段分隔符拆分。 - 文本字段和数值字段对写入内容的格式要求完全不同。
文本字段逗号可正常保留的原因
你提到的取值为D,i,Y的文本字段,在原始CSV文件中是被双引号包裹的,比如对应CSV行的内容为..."D,i,Y",...。
MySQL拆分字段时识别到双引号包裹标识,不会将内容内部的逗号作为分隔符拆分,完整的D,i,Y字符串会直接写入文本类型字段,自然不会出现内容丢失。
数值字段逗号触发截断的原因
两种场景都会导致你碰到的截断问题:
- 原始CSV中
1,234没有被双引号包裹:MySQL拆分字段时碰到1后的逗号,直接将其判定为字段边界,只把1赋值给对应数值字段,后面的234会被分配给下一个字段。 - 原始CSV中
1,234已经被双引号包裹:MySQL的数值类型(INT、DECIMAL等)无法识别带千分位逗号的字符串格式,解析时会从第一个非数值字符(也就是逗号)位置直接截断,只保留前面的1。
修复方案
- 方案一:导出CSV时给所有数值字段统一加上双引号包裹,导入时先将对应字段临时设置为文本类型,导入完成后执行SQL去掉千分位逗号再转为数值类型,参考语句:
UPDATE social_spend SET 数值字段名 = REPLACE(数值字段名, ',', '') + 0;
- 方案二:导出CSV前提前清理数值字段的千分位逗号,导出为纯数字格式后再导入MySQL。
内容的提问来源于stack exchange,提问作者Joseph Erickson
相关产品推荐
相关产品推荐

