csv导入mysql null

我必须导入一些csv格式的数据到一个MySQL(mariadb)数据库。 没有csv标题,并且行看起来像这样:

00323acd-7909-41a4-a849-073ca3391dcf,2014-05,\ n
00323acd-7909-41a4-a849-073ca3391dcf,2014-05,1

所以他们包含一些hexid,年/月组合和一个可选的int值。 我使用\ N(hex:5c 4e)来标记NULL值(mysql使用这个样式来导出空值)。

LOAD DATA LOCAL INFILE 'path/to/data.csv' INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n' (id, @date_time_variable, value) SET date = STR_TO_DATE(@date_time_variable, '%Y-%m'); 

但是好像数据库不能识别'\ N'编码的空值。

 Query OK, 38581 rows affected, 14596 warnings (0.54 sec) Records: 38581 Deleted: 0 Skipped: 0 Warnings: 14596 MariaDB [run5]> show warnings; +---------+------+-------------------------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------------------------+ ' for column 'value' at row 1 |ger value: 'N ' for column 'value' at row 2 |ger value: 'N ' for column 'value' at row 3 |ger value: 'N 

模式如下所示:

 CREATE TABLE `data_table` ( `id` char(36) NOT NULL, `date` date NOT NULL, `value` int(11) DEFAULT NULL, KEY `mbid` (`id`), KEY `date` (`date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

有人知道这个错误或解决scheme吗?

编辑:

这里是show warnings \G;的输出show warnings \G;

 MariaDB [run5]> show warnings \G; *************************** 1. row *************************** Level: Warning Code: 1366 ' for column 'value' at row 1lue: 'N *************************** 2. row *************************** Level: Warning Code: 1366 ' for column 'value' at row 2lue: 'N *************************** 3. row *************************** Level: Warning Code: 1366 ' for column 'value' at row 3lue: 'N *************************** 4. row *************************** Level: Warning Code: 1366 ' for column 'value' at row 4lue: 'N *************************** 5. row *************************** Level: Warning Code: 1366 ' for column 'value' at row 5lue: 'N ... 

这里是一个hexdump的文件:

 ~/D/path ❯❯❯ head -n 2 data/file.csv | hexdump -C master ✱ ◼ 00000000 30 30 33 32 33 63 63 64 2d 37 39 30 39 2d 34 31 |00323ccd-7909-41| 00000010 61 34 2d 61 38 34 39 2d 30 37 33 63 61 33 33 39 |a4-a849-073ca339| 00000020 31 64 63 66 2c 32 30 31 34 2d 30 35 2c 5c 4e 0d |1dcf,2014-05,\N.| 00000030 0a 30 30 33 32 33 63 63 64 2d 37 39 30 39 2d 34 |.00323ccd-7909-4| 00000040 31 61 34 2d 61 38 34 39 2d 30 37 33 63 61 33 33 |1a4-a849-073ca33| 00000050 39 31 64 63 66 2c 32 30 31 34 2d 31 32 2c 5c 4e |91dcf,2014-12,\N| 00000060 0d 0a |..| 00000062 

第三行包含2c 5c 4e ,代表,\N ,这是正确的,还是不是?

编辑2:

我更新了查询,因为我使用了错误的行结束符( \n而不是\r\n )。 现在我得到一个关于这个错误值的错误消息:

 MariaDB [run5]> LOAD DATA LOCAL INFILE '/path/data.csv' INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n\r' (id, @date_time_variable, value) SET date = STR_TO_DATE(@date_time_variable, '%Y-%m'); Query OK, 1 row affected, 1 warning (0.01 sec) Records: 1 Deleted: 0 Skipped: 0 Warnings: 1 MariaDB [run5]> show warnings \G *************************** 1. row *************************** Level: Warning Code: 1366 Message: Incorrect integer value: 'N 00323ccd-7909-41a4-a849-073ca3391dcf' for column 'value' at row 1 1 row in set (0.00 sec) 

我没有尝试过,但是我读LOAD DATA INFILE手册的是,对“\ N”序列的解释是由ESCAPED BY子句控制的,并且默认不执行转义序列处理。 如果这是正确的,将“ESCAPED BY'\\'”添加到您的查询应该有你想要的结果。

我怀疑正在导入的数据格式不正确。 特别是\N在部分或全部情况下丢失\

validation数据是否正确。 你可以做这样的事情:

 $ awk -F, '$3=="\\N"{print $0}' moo.csv 00323acd-7909-41a4-a849-073ca3391dcf,2014-05,\N $ awk -F, '$3=="N"{print $0}' moo.csv 00323acd-7909-41a4-a849-073ca3391dcf,2014-05,N 

此外,警告输出被切断。 再次尝试导入,然后使用以下内容:

 show warnings \G