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
祝你好运。