我有一个文件,其中可以包含 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/