Почему мои "NULL" записи даты и времени из tsv конвертируются в 0000-00-00 00:00:00? - PullRequest
0 голосов
/ 23 апреля 2020

Недавно обновлено до mysql Ver 8.0.19 for osx10.15 on x86_64 (Homebrew)

Я пытаюсь загрузить данные из файла tsv, чтобы добавить записи в существующую таблицу. Кажется, что все работает нормально, за исключением значений, которые имеют значение «NULL» (поскольку в нем буквально говорится, что он не пустой) преобразовываются в 0000-00-00 00:00:00. Там нет ошибок, но я получаю предупреждение «Данные усечены для столбца« beginexp »в строке 2».

Вот что я пробовал, но безрезультатно:

ALTER TABLE infomegatask 
ALTER beginexp SET DEFAULT NULL; # same for field 'endhit'

ALTER TABLE infomegatask MODIFY COLUMN beginexp DATETIME NULL; #even though it was already nullable to begin with when I checked the schema

#also set sql_mode="NO_ZERO_DATE"

Здесь это отредактированный фрагмент того, как выглядит tsv (конфиденциальные данные были скрыты):

uniqueid    assignmentid    workerid    hitid   ipaddress   browser platform    language    cond    counterbalance  codeversion beginhit    beginexp    endhit  bonus   status  mode    datastring
XXXXX:YYYYY ZZZZZ   AAAAA   BBBBB   CCCCC   chrome  windows UNKNOWN 0   0   4.2 2020-04-22 16:32:24 NULL    NULL    0   4   live
mysql> LOAD DATA LOCAL INFILE 'test/DB/tsv/infomegatask_round_9g.tsv' INTO TABLE infomegatask FIELDS TERMINATED BY '\t' ENCLOSED BY '' LINES TERMINATED BY '\n' IGNORE 1 LINES;
Query OK, 24 rows affected, 13 warnings (0.21 sec)
Records: 24  Deleted: 0  Skipped: 0  Warnings: 13

mysql> warnings
Show warnings enabled.
mysql> show warnings
    -> ;
+---------+------+------------------------------------------------+
| Level   | Code | Message                                        |
+---------+------+------------------------------------------------+
| Warning | 1265 | Data truncated for column 'beginexp' at row 2  |
| Warning | 1265 | Data truncated for column 'endhit' at row 2    |
| Warning | 1265 | Data truncated for column 'beginexp' at row 4  |
| Warning | 1265 | Data truncated for column 'endhit' at row 4    |
| Warning | 1265 | Data truncated for column 'beginexp' at row 7  |
| Warning | 1265 | Data truncated for column 'endhit' at row 7    |
| Warning | 1265 | Data truncated for column 'beginexp' at row 9  |
| Warning | 1265 | Data truncated for column 'endhit' at row 9    |
| Warning | 1265 | Data truncated for column 'beginexp' at row 10 |
| Warning | 1265 | Data truncated for column 'endhit' at row 10   |
| Warning | 1265 | Data truncated for column 'endhit' at row 14   |
| Warning | 1265 | Data truncated for column 'beginexp' at row 20 |
| Warning | 1265 | Data truncated for column 'endhit' at row 20   |
+---------+------+------------------------------------------------+
13 rows in set (0.00 sec)

Я имею в виду, что обходной путь, с которым я сейчас работаю, это просто обновить эти нулевые значения времени до NULL , но это немного раздражает, и я просто хотел бы выяснить, что происходит не так.

1 Ответ

1 голос
/ 23 апреля 2020

В синтаксисе LOAD DATA вы можете конвертировать столбцы.

В вашем случае:

  LOAD DATA
  INTO TABLE  xx ( .., @beginexp , ... )
  ...
  SET beginexp = IF(@beginexp='NULL', NULL, @beginexp),
  ...
...