MySQL Error Code 1265 导入CSV时FLOAT类型列数据截断问题咨询
MySQL导入CSV报Error 1265(FLOAT列数据截断)原因说明
核心原因
- FLOAT属于二进制浮点类型,无法精准存储所有十进制小数。你CSV里的3.56、25.23这类十进制小数,转成二进制FLOAT存储时会出现不可避免的精度损耗,数值和原值有轻微差异。
- MySQL 8.0默认开启严格SQL模式(
STRICT_TRANS_TABLES),只要数据转换过程中出现任何精度丢失、长度截断的情况,都会直接抛出1265错误,而非普通警告。 - DECIMAL是十进制定点类型,存储逻辑和CSV里的十进制小数完全匹配,转换过程没有精度损耗,符合严格模式的校验规则,因此可以正常导入。
可选解决方案(如果必须使用FLOAT类型)
- 临时关闭当前会话的严格模式再执行导入:
SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', ''); -- 再执行LOAD DATA INFILE语句即可
- 导入时对score列做显式转换,避免隐式转换触发校验:
LOAD DATA INFILE "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/test_data.csv" INTO TABLE dummy COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (entry_id, first_name, last_name, @temp_score) SET score = CAST(@temp_score AS FLOAT);
原始操作代码参考
CREATE TABLE dummy( entry_id INT NOT NULL, first_name VARCHAR(15) NOT NULL, last_name VARCHAR(15) NOT NULL, score FLOAT NOT NULL, PRIMARY KEY (entry_id) ); LOAD DATA INFILE "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/test_data.csv" INTO TABLE dummy COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
CSV样例参考
| entry_id | first_name | last_name | score |
|---|---|---|---|
| 1 | Joshua | Mbweka | 3.56 |
| 2 | Mary | Njoroge | 25.23 |
| 3 | Adam | Kimanzi | 64.41 |
| 4 | Eve | Faluna | 56.13 |
| 5 | Lester | Chuma | 89.21 |
内容的提问来源于stack exchange,提问作者Babypowder
相关产品推荐
相关产品推荐

