从CSV上传MYSQL维护空值

时间:2013-08-02 10:47:11

标签: mysql csv import null

我有一个MYSQL数据库,其中包含许多字段,其中许多字段都配置为数值:

  
    

thickness double(7,2)DEFAULT NULL,

  

  
    

has_input tinyint(4)DEFAULT NULL,

  

我必须将csv文件导入此表并且一直在使用

  
    

将数据本地infile'myfilepath / file.csv'加载到以',''括起的表combined字段中,用“\ n”排列的'''行包围;

  

但是所有数字字段都将零值替换为零。这真的很烦人,因为有些字段的合法值为零,我需要能够将这些字段与没有值的字段区分开来。

如上所示,字段默认值设置为null,在其他建议中,我在csv的所有空白字段中输入\ N以表示null。

尽管如此,空值仍然被零替换。你能帮忙吗?

2 个答案:

答案 0 :(得分:9)

由于导入CSV时处理NULL列的规则相当复杂,因此在LOAD DATA INFILE文档中有一个专门的处理NULL值的部分:
http://dev.mysql.com/doc/refman/5.1/en/load-data.html

在您的具体案例中:

  

如果FIELDS ENCLOSED BY不为空,则为包含文字的字段   单词NULL,因为其值被读取为NULL值。这不同于   包含在FIELDS中的单词NULL包含在字符中,读取的字符   作为字符串'NULL'。


尝试通过用 NULL (不含引号)替换缺少的值来预处理CSV文件。

如果您的原始CSV文件中有类似的内容:

0,1,2,,5

它应该像这样进行转换,以便MySQL在第4列中正确插入NULL:

0,1,2,NULL,5

答案 1 :(得分:7)

可以用同一句话来对待。

鉴于下表:

CREATE TABLE `testcsv` (
  `col0` INT(11) NOT NULL,
  `col1` VARCHAR(20) DEFAULT NULL,
  `col2` DECIMAL(5,2) DEFAULT NULL
);

和以下文件.csv:test.csv

1,\N,0
2,"string",102.20
3,\N,
4,"string",\N
5,"string",NULL
6,"string",

运行:

LOAD DATA INFILE 'path/test.csv' INTO TABLE `testcsv`
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
(`col0`, `col1`, @col2)
SET `col2` = IF(CHAR_LENGTH(TRIM(@col2)) = 0, NULL, @col2);

结果:

mysql> SELECT `col0`, `col1`, `col2` FROM `testcsv`;

+------+--------+--------+
| col0 |  col1  |  col2  |
+------+--------+--------+
|    1 | NULL   |   0.00 |
|    2 | string | 102.20 |
|    3 | NULL   |   NULL |
|    4 | string |   NULL |
|    5 | string |   NULL |
|    6 | string |   NULL |
+------+--------+--------+
6 ROWS IN SET (0.00 sec)