【问题标题】:Why are my "NULL" datetime entries from tsv being converted to 0000-00-00 00:00:00?为什么我的 tsv 中的“NULL”日期时间条目被转换为 0000-00-00 00:00:00?
【发布时间】:2020-08-06 04:23:42
【问题描述】:

最近更新为mysql Ver 8.0.19 for osx10.15 on x86_64 (Homebrew)

我正在尝试从 tsv 文件加载数据以将条目添加到现有表。一切似乎都工作正常,除了“NULL”的值(如字面意思,它不是空的)正在转换为 0000-00-00 00:00:00。没有错误,但我确实收到警告“第 2 行的列 'beginexp' 的数据被截断”。

这是我尝试过的,但无济于事:

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 外观的经过编辑的 sn-p(敏感数据已被隐藏):

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,但这有点烦人,我只想弄清楚出了什么问题。

【问题讨论】:

    标签: mysql csv datetime null truncated


    【解决方案1】:

    LOAD DATA 语法中,您可以转换列。

    所以在你的情况下:

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

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2013-06-09
      • 2010-11-24
      • 2015-07-19
      • 1970-01-01
      相关资源
      最近更新 更多