我有一个文件,可以包含3到4列数字,用逗号分隔 . 当空字段位于行的末尾时,将定义空字段:
1,2,3,4,5
1,2,3,,5
1,2,3
下表是在MySQL中创建的:
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| one | int(1) | YES | | NULL | |
| two | int(1) | YES | | NULL | |
| three | int(1) | YES | | NULL | |
| four | int(1) | YES | | NULL | |
| five | int(1) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
我正在尝试使用MySQL LOAD命令加载数据:
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 .
不幸的是,我必须能够在这个阶段区分NULL和0,所以任何帮助将不胜感激 .
谢谢S.
编辑
SHOW WARNINGS的输出:
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'four' at row 2 |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
+---------+------+--------------------------------------------------------+
4 回答
这将做你想要的 . 它将第四个字段读入局部变量,然后将实际字段值设置为NULL,如果局部变量最终包含空字符串:
如果它们都可能为空,那么你将它们全部读入变量并有多个SET语句,如下所示:
MySQL manual说:
所以你需要用\ N替换空白像这样:
根据数据库配置,行为会有所不同 . 在严格模式下,这会抛出错误,否则会发出警告 . 以下查询可用于标识数据库配置 .
预处理输入CSV以使用\ N替换空白条目 .
尝试正则表达式:s / ,, /,\ n,/ g和s /,$ /,\ N / g
祝好运 .