为什么在MYSQL中导入CSV时行中的数据被截断?

Why is the data in row truncated when importing CSV in MYSQL?

提问人:Apojoost 提问时间:2/18/2022 最后编辑:Apojoost 更新时间:3/29/2022 访问量:795

问:

我在Mysql中有一个表,如下所示:

CREATE TABLE `overig`.`test`(
`ID` INT(10) AUTO_INCREMENT,
`Order_ID` DECIMAL(10) NOT NULL,
`Price_total` DECIMAL(12,2),
PRIMARY KEY (`ID`)
);

我想导入以下 CSV:

Order_ID;Price_total
145131343;118,35
145131349;79,35

我将CSV数据加载到MYSQL表中:

LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE `overig`.`test` 
FIELDS TERMINATED BY ';' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES
    (`Order_ID`, @Price_total)
    SET `Price_total` = 0 + REPLACE(@Price_total, ',', '.');

响应:

Query OK, 2 rows affected, 1 warning (0.04 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 1

mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message                                          |
+-------+------+--------------------------------------------------+
| Note  | 1265 | Data truncated for column 'Price_total' at row 2 |
+-------+------+--------------------------------------------------+

为什么我会收到此警告?第 2 行和第 3 行的值有什么区别?

结果还可以,但我想了解警告。

mysql> select * from test;
+----+-----------+-------------+
| ID | Order_ID  | Price_total |
+----+-----------+-------------+
|  1 | 145131343 |      118.35 |
|  2 | 145131349 |       79.35 |
+----+-----------+-------------+
2 rows in set (0.00 sec)

如果我将 csv 中的顺序更改为:

Order_ID;Price_total
145131343;79,35
145131349;118,35

我得到以下内容:

Query OK, 2 rows affected, 1 warning (0.04 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 1

mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message                                          |
+-------+------+--------------------------------------------------+
| Note  | 1265 | Data truncated for column 'Price_total' at row 1 |
+-------+------+--------------------------------------------------+
1 row in set (0.00 sec)

如果我像这样导入数据,则没有警告:

LOAD DATA LOCAL INFILE 'test4.csv' INTO TABLE `overig`.`test` FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (
`Order_ID`, @Price_total)
SET 
`Price_total`  = REPLACE(@Price_total, ',','.');
MySQL CSV 替换 导入 警告

评论

0赞 2/18/2022
请通过执行 SELECT 检查导入了哪些值
4赞 P.Salmon 2/18/2022
以“n”结尾的行应为以“\n”结尾的行,也可能是以“\r\n”结尾的行
0赞 P.Salmon 2/18/2022
奇怪的是,我用你的数据测试了你的代码,没有给出警告,也没有插入任何内容。

答:

0赞 Apojoost 2/20/2022 #1

如果我将表格重新设计为:

CREATE TABLE `overig`.`test`(
`ID` INT(10) AUTO_INCREMENT,
`Order_ID` DECIMAL(10) NOT NULL,
`Price_total` FLOAT(12,2),
PRIMARY KEY (`ID`)
);

所以我将数据类型从 更改为 我没有收到警告,尽管我不完全明白为什么。DECIMALFLOAT

如果我更改:

SET `Price_total` = 0 + REPLACE(@Price_total, ',', '.');

自:

SET `Price_total` = REPLACE(@Price_total, ',', '.');

然后它也可以在没有警告的情况下工作,但是我添加了上面的代码以避免在空的情况下收到警告。那么我还有另一个问题。@Price_total