使用LOAD DATA INFILE导入CSV遇Error 1265:delivery_cost列截断求助
问题根因解释
核心原因:CSV数据含隐藏非打印字符,直接导入触发类型转换截断
你碰到的问题和DOUBLE(10,2)的精度设置无关——DOUBLE(M,D)里的M是显示宽度、D是小数位数,它根本不限制数值的存储范围,所以改精度没用。真正的问题是你的CSV里delivery_cost列的数值(比如6.0、27.0)带有隐藏的非打印字符,比如Windows下的回车符\r、字段末尾残留的空格/制表符,或是编码转换产生的不可见字节。
用LOAD DATA INFILE直接映射列时,MySQL会把字段的完整内容(包括隐藏字符)当作字符串尝试转成DOUBLE类型,这些额外字符会让MySQL判定该字符串无法安全转换成符合DOUBLE(10,2)格式要求的数值,于是抛出Error 1265 数据截断。
为什么SET delivery_cost = @delivery_cost + 0能解决?
这个写法利用了MySQL的隐式类型转换特性:当对字符串执行算术运算时,MySQL会自动忽略字符串首尾的非数字字符,只提取有效的数字部分转换为数值。比如如果字段内容是6.0\r(带Windows回车符),@delivery_cost + 0会自动剔除\r,把6.0转成合法的DOUBLE值,自然不会触发截断错误。
验证方法(可选)
你可以临时把CSV数据导入到一个带字符串列的临时表,然后用HEX()函数查看原始字段的十六进制编码:
CREATE TEMPORARY TABLE temp_demo (delivery_cost_str VARCHAR(20)); LOAD DATA INFILE 'your_file.csv' INTO TABLE temp_demo FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; SELECT delivery_cost_str, HEX(delivery_cost_str) FROM temp_demo;
如果结果里除了数字和.对应的十六进制(比如362E30对应6.0),还有额外字节(比如0D对应\r),就能实锤是隐藏字符导致的问题。
内容的提问来源于stack exchange,提问作者rax0000
相关产品推荐
相关产品推荐

