You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:45:49