MySQL 的 LOAD 命令提供了一种将数据从 CSV 文件导入表的简单方法。然而,当从包含空字段的 CSV 文件加载数值数据时,MySQL 倾向于插入零而不是 NULL,即使该列被定义为可空。
考虑以下 CSV 文件 (testdata.txt):
1,2,3,4,5 1,2,3,,5 1,2,3
以及以下 MySQL 表 (moo):
CREATE TABLE moo ( one INT(1) NULL, two INT(1) NULL, three INT(1) NULL, four INT(1) NULL, five INT(1) NULL );
将 CSV 数据加载到使用 LOAD 命令的 moo 表:
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,请使用 NULLIF() 函数。 NULLIF() 有两个参数:要检查的字段和字段为空时返回的值。使用方法如下:
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,'') ;
在此示例中,第四个字段被读入局部变量@vfour。如果 @vfour 是空字符串,则 SET 语句将 4 个赋给 NULL。
如果多个字段可以为空,请将它们全部读入局部变量并使用多个 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,'') ;
通过利用 NULLIF(),MySQL LOAD 现在可以正确处理空字段并分配 NULL 值,使您能够准确地处理 MySQL 表中的数据。
以上是使用LOAD DATA INFILE将空字段的CSV数据导入MySQL时如何处理NULL值而不是零?的详细内容。更多信息请关注PHP中文网其他相关文章!