MySQL 从 CSV 数据加载 NULL 值

标签 mysql csv load-data-infile

我有一个文件,其中可以包含 3 到 4 列以逗号分隔的数值。空字段的定义异常(exception),当它们位于行末尾时:

1,2,3,4,5
1,2,3,,5
1,2,3

下表是在 MySQL 中创建的:

+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| one   | int(1) | YES  |     | NULL    |       | 
| two   | int(1) | YES  |     | NULL    |       | 
| three | int(1) | YES  |     | NULL    |       | 
| four  | int(1) | YES  |     | NULL    |       | 
| five  | int(1) | YES  |     | NULL    |       | 
+-------+--------+------+-----+---------+-------+

I am trying to load the data using MySQL LOAD command:

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

结果表:

+------+------+-------+------+------+
| one  | two  | three | four | five |
+------+------+-------+------+------+
|    1 |    2 |     3 |    4 |    5 | 
|    1 |    2 |     3 |    0 |    5 | 
|    1 |    2 |     3 | NULL | NULL | 
+------+------+-------+------+------+

问题在于,当原始数据中某个字段为空并且未定义时,MySQL 由于某种原因不使用列默认值(即 NULL)并使用零。当字段全部丢失时,NULL 可以正确使用。

不幸的是,我必须能够在这个阶段区分 NULL 和 0,因此我们将不胜感激。

谢谢

编辑

显示警告的输出:

+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'four' at row 2 | 
| Warning | 1261 | Row 3 doesn't contain data for all columns             | 
| Warning | 1261 | Row 3 doesn't contain data for all columns             | 
+---------+------+--------------------------------------------------------+

最佳答案

这会做你想要的。它将第四个字段读入局部变量,然后如果局部变量最终包含空字符串,则将实际字段值设置为 NULL:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;

如果它们都可能为空,那么您会将它们全部读入变量并使用多个 SET 语句,如下所示:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;

关于MySQL 从 CSV 数据加载 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35008784/

相关文章:

java - 加载数据查询不适用于 INSERT/REPLACE 选项

php - 将搜索结果输出到 Excel 或 CSV

php - 61SQLSTATE[HY000] [2002] Docker 容器 PHP/Apache 中的连接被拒绝

mysql - 使用单个查询从 mysql 表中删除 csv 文件值

带有默认时间戳列值的 mysql LOAD DATA LOCAL INFILE

使用加载数据命令的 MySQL 格式日期

PHP/MySQLi - file_get_contents() 超出允许的最大数据包数

MYSQL:如何更新具有相同值的多个列

sql - CSV 回车字符

Linux命令行处理CSV