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/53274968/

相关文章:

mysql - 脚本仅在一个系统上给出数据库错误

c# - 在c#中实现的数据库连接器接口(interface)

c# - SQL连接错误或数据库表名错误

python - 在 python 中读取 .csv 的特定行数

php - 如何使用 PHP Load Data Infile 将表的当前副本替换为新副本?

sql - MySQL中的字符编码问题

python - 读取 CSV 的单列并存储在数组中

python - 对多个 csv 文件重复相同的过程

java - Mysql 'LOAD DATA LOCAL INFILE' 根据文件指定列的值

mySql:批量插入的合理限制