Назад | Перейти на главную страницу

csv import mysql null

Мне нужно импортировать некоторые данные в формате csv в базу данных mysql (mariadb). Заголовка csv нет, и строки выглядят так:

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

Таким образом, они содержат некоторый шестнадцатеричный идентификатор, комбинацию года / месяца и необязательное значение типа int. Я использую \ N (hex: 5c 4e), чтобы отметить значения NULL (mysql также использует этот стиль для экспорта значений NULL).

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');

Но похоже, что база данных не распознает Null-значения в кодировке \ 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;

Кто-нибудь знает эту ошибку или решение?

РЕДАКТИРОВАТЬ:

вот результат 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
...

А вот шестнадцатеричный дамп файла:

~/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, и что по умолчанию обработка escape-последовательностей не выполняется. Если это верно, добавление «ESCAPED BY '\\'» к вашему запросу должно дать желаемые результаты.

Я подозреваю, что импортируемые данные искажены. В частности \N пропал, отсутствует \ в некоторых или во всех случаях.

Убедитесь, что данные верны. Вы можете сделать что-то вроде этого:

$ 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