MySQL从CSV数据中加载NULL值

我有一个文件,可以包含3到4列的数值,用逗号分隔。 空字段在行的末尾被定义为exception:

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

下表是在MySQL中创build的:

 + ------- + -------- + ------ + ------ + --------- + ------- +
 | 字段| types| 空| 密钥| 默认| 额外|
 + ------- + -------- + ------ + ------ + --------- + ------- +
 | 一个|  int(1)| 是|  |  NULL |  | 
 | 两个|  int(1)| 是|  |  NULL |  | 
 | 三| |  int(1)| 是|  |  NULL |  | 
 | 四|  int(1)| 是|  |  NULL |  | 
 | 五|  int(1)| 是|  |  NULL |  | 
 + ------- + -------- + ------ + ------ + --------- + ------- +

我正在尝试使用MySQL LOAD命令加载数据:

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

结果表格:

 + ------ + ------ + ------- + ------ + ------ +
 | 一个| 两个| 三| | 四| 五|
 + ------ + ------ + ------- + ------ + ------ +
 |  1 |  2 |  3 |  4 |  5 | 
 |  1 |  2 |  3 |  0 |  5 | 
 |  1 |  2 |  3 |  NULL |  NULL | 
 + ------ + ------ + ------- + ------ + ------ +

问题在于,当一个字段在原始数据中是空的而且没有被定义时,MySQL由于某种原因不使用列的默认值(它是NULL)并且使用零。 当字段一起缺失时,NULL正确使用。

不幸的是,我必须能够在这个阶段区分NULL和0,所以任何帮助将不胜感激。

谢谢S.

编辑

SHOW WARNINGS的输出:

 + --------- + ------ + -------------------------------- ------------------------ +
 | 级别| 代码| 留言|
 + --------- + ------ + -------------------------------- ------------------------ +
 | 警告|  1366 | 不正确的整数值:''在第2行的列'四' 
 | 警告|  1261 | 第3行不包含所有列的数据| 
 | 警告|  1261 | 第3行不包含所有列的数据| 
 + --------- + ------ + -------------------------------- ------------------------ +

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

 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,'') ; 

如果它们都可能是空的,那么你可以将它们全部读入variables,并有多个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手册说:

当使用LOAD DATA INFILE读取数据时,空或缺less的列用''更新。 如果您想在列中使用NULL值,则应该在数据文件中使用\ N。 在某些情况下也可以使用文字“NULL”。

所以你需要用\ Nreplace这个空格:

 1,2,3,4,5 1,2,3,\N,5 1,2,3 

行为根据数据库configuration而不同。 在严格的模式下,这会抛出一个错误,另外一个警告。 以下查询可用于识别数据库configuration。

 mysql> show variables like 'sql_mode'; 

预处理您的inputCSV以用\ Nreplace空白条目。

尝试正则expression式:s / ,, /,\ n,/ g和s /,$ /,\ N / g

祝你好运。