如何在导入数字时通过在MySQL表中用点替换逗号来避免警告?

How can I avoid warnings when importing numbers by replacing comma's with a dot in a MySQL table?

提问人:Apojoost 提问时间:2/17/2022 最后编辑:AkinaApojoost 更新时间:4/30/2022 访问量:150

问:

我在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,8
145131349;  

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

LOAD DATA LOCAL INFILE 'test3.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, ',', '.');
The response:
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> show warnings;
+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1366 | Incorrect decimal value: '' for column 'Price_total' at row 2 |
+---------+------+---------------------------------------------------------------+
1 row in set (0.00 sec)

当 Price_total 为 een 空值时,如何避免此警告?

MySQL CSV 替换 导入 警告

评论


答:

1赞 Akina 2/17/2022 #1

使用隐式转换。

LOAD DATA LOCAL INFILE 'test3.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, ',', '.');

评论

0赞 Apojoost 3/29/2022
隐式转换以某种方式给出了带有 DECIMAL(12,2) 的“警告”。
1赞 Akina 3/29/2022
@Apojoost 这是安全的(警告告诉可能的准确性松散)。但是您可以使用显式 CAST(REPLACE(@Price_total, ',', '.')如 DECIMAL(12,2))。
0赞 Apojoost 4/30/2022 #2

我解决了。

问题是在 SQL 表中加载 ' '。

使用 IF 语句时,它会正确无误,不会发出警告。

我用了:

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