我有一个MYSQL数据库,其中包含许多字段,其中许多字段都配置为数值:
thickness
double(7,2)DEFAULT NULL,
或
has_input
tinyint(4)DEFAULT NULL,
我必须将csv文件导入此表并且一直在使用
将数据本地infile'myfilepath / file.csv'加载到以',''括起的表
combined
字段中,用“\ n”排列的'''行包围;
但是所有数字字段都将零值替换为零。这真的很烦人,因为有些字段的合法值为零,我需要能够将这些字段与没有值的字段区分开来。
如上所示,字段默认值设置为null,在其他建议中,我在csv的所有空白字段中输入\ N以表示null。
尽管如此,空值仍然被零替换。你能帮忙吗?
答案 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)