MySQL загружает значения NULL из данных CSV
У меня есть файл, который может содержать от 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 |
+---------+------+--------------------------------------------------------+
Ответы
Ответ 1
Это сделает то, что вы хотите. Он считывает четвертое поле в локальную переменную, а затем устанавливает фактическое значение поля в NULL, если локальная переменная заканчивается, содержащая пустую строку:
LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(one, two, three, @vfour, five)
SET four = nullif(@vfour,'')
;
Если все они пустые, то вы должны прочитать их все в переменных и иметь несколько операторов SET, например:
LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = nullif(@vone,''),
two = nullif(@vtwo,''),
three = nullif(@vthree,''),
four = nullif(@vfour,'')
;
Ответ 2
Руководство MySQL говорит:
При чтении данных с LOAD DATA INFILE, пустые или отсутствующие столбцы обновлено с помощью ''. Если вы хотите получить NULL значение в столбце, вы должны использовать \N в файле данных. Буквальное слово "NULL" также может использоваться под обстоятельства.
Итак, вам нужно заменить пробелы \N следующим образом:
1,2,3,4,5
1,2,3,\N,5
1,2,3
Ответ 3
Поведение различно в зависимости от конфигурации базы данных. В строгом режиме это еще раз вызовет ошибку.
Следующий запрос может быть использован для идентификации конфигурации базы данных.
mysql> show variables like 'sql_mode';
Ответ 4
Предварительно создайте свой CSV файл для замены пустых записей \N.
Попытка регулярного выражения: s/,/,\n,/g и s/, $/,\N/g
Удачи.
Ответ 5
Показывать переменные вроде " secure_file_priv
";
Примечание. Храните CSV файл в месте, указанном вышеупомянутой командой.
create table assessments (course_code varchar(5),batch_code varchar(7),id_assessment int, assessment_type varchar(10), date int , weight int);
Примечание: здесь столбец " date
" имеет некоторые пустые значения в файле CSV.
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/assessments.csv'
INTO TABLE assessments
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(course_code,batch_code,id_assessment,assessment_type,@date,weight)
SET date = IF(@date = '', NULL, @date);