mysqlimport NULL значения при импорте из файла с разделителями
Я запускаю mysqlimport для загрузки данных, и у меня возникла проблема с пустыми значениями, не загружается как ноль. Я использую mysql 5.7.23
Проблема может быть воссоздана путем создания файла с именем mytable.psv, содержащего:
code|date_a|date_b
1|2018-11-27|2018-11-27
2|2018-11-27|
Затем запустите команды:
mysql -u root -e "CREATE DATABASE mydb"
mysql -u root -e "USE mydb; CREATE TABLE mytable (code varchar(15) NOT NULL, date_a date NOT NULL, date_b date);"
mysqlimport --ignore-lines=1 --fields-terminated-by='|' --columns="code,date_a,date_b" --local -u root mydb mytable.psv
mysql -u root -e "USE mydb; SELECT * FROM mytable;"
Выход:
mydb.mytable: Records: 2 Deleted: 0 Skipped: 0 Warnings: 1
+------+------------+------------+
| code | date_a | date_b |
+------+------------+------------+
| 1 | 2018-11-27 | 2018-11-27 |
| 2 | 2018-11-27 | 0000-00-00 |
+------+------------+------------+
Вы можете видеть, что date_b для второй строки пуста, и мне нужно, чтобы она была нулевой, но вместо этого она преобразуется в 0000-00-00. Это ломает ограничения, которые мне нужны в дальнейшем. Есть ли способ гарантировать, что пустые значения будут нулевыми при импорте данных из файла с разделителями?
0 ответов
Мне удалось найти ответы здесь: https://dev.mysql.com/doc/refman/8.0/en/mysqlimport.html https://dev.mysql.com/doc/refman/8.0/en/load-data.html Вам нужно символы '\N', чтобы импортировать ноль, поэтому в приведенном выше примере это будет:
code|date_a|date_b
1|2018-11-27|2018-11-27
2|2018-11-27|\N
Просто чтобы добавить к ответу Антонио, если, как и я, вам нужно программно вставить \N в отсутствующие поля, чтобы сохранить значения NULL при импорте для дампа csv-файла, вам может потребоваться включить --fields-terminated-by=','или как бы там ни было, потому что, если вы этого не сделаете, mysqlimport неверно интерпретирует \N как терминатор поля или, возможно, терминатор строки даже в середине строки.