【问题标题】:MySQL field DATETIME truncates ISO8601MySQL 字段 DATETIME 截断 ISO8601
【发布时间】:2018-01-30 18:00:34
【问题描述】:

像这样创建 MySQL/MariaDB 表

CREATE TABLE `testTable` (
  `id` int(11) NOT NULL,
  `timeinfo` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

并像这样插入完整的 ISO8601 值:

MariaDB [test]> INSERT INTO testTable VALUES (1, '2500-12-31T00:00:00.000Z');
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1265 | Data truncated for column 'timeinfo' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> select * from testTable;
+----+---------------------+
| id | timeinfo            |
+----+---------------------+
|  1 | 2500-12-31 00:00:00 |
+----+---------------------+
1 row in set (0.01 sec)

我没有完全看到被截断的内容,ZULU TimeZone 中的“Z”?


是否可以将信息完全包含在 MySQL/MariaDB 字段类型中?

如果是,应该使用哪种字段数据类型?

【问题讨论】:

  • 在我看来小数秒被截断了。在 MySQL 5.7 和 MariaDB 5.3 中,您可以使用``timeinfo` datetime(3) DEFAULT NULL 来启用小数秒支持,请注意 datetime 之后的 (3) .
  • @RaymondNijland 谢谢,这在技术上是正确的,但是插入的时区仍然被截断,不是吗?

标签: mysql import mariadb truncation


【解决方案1】:

“Z”是special time zone designator。意思是“时间是UTC时区”。

MySQL 5.7 日期时间和时间戳类型无法存储时区信息。 MySQL 不理解“Z”。

如果您需要存储时区,请使用附加字段。

【讨论】:

  • 我能以某种方式摆脱警告吗?我不需要存储时区信息,因为 DB-instance/server 的 TIMEZONE 与插入的所有数据相同。谢谢
  • @MarekSebera 很简单。 insert into testTable values( 1, replace('2017-08-22T16:55:55.000Z','Z','') );
  • 我知道我可以通过修改数据来消除警告,但我正在寻找一种方法,而无需接触数据。例如设置数据库实例,使其在这种特定情况下忽略时区或不发出警告。我正在从 CSV 数据批量加载。
  • 您无法摆脱警告。您只能关闭所有警告。 :) 如果您之前无法使用 SED/AWK 处理 CSV 文件,我建议您可以将日期时间信息加载到新的 VARCHAR 字段中。导入后执行更新 timeinfo=replace(oldfield, ... ) 。
【解决方案2】:

数据库需要另一个输入,这就是您收到警告的原因

在 MySQL 中 DATETIME 需要以下格式

DATETIME - 格式:YYYY-MM-DD HH:MI:SS

这不会产生任何警告:

INSERT INTO testTable VALUES (, '2500-12-31 00:00:00');

即使有您的警告,数据库也会填写您的记录。

【讨论】:

  • 我可以摆脱 imezone 以某种方式被截断的警告吗?我不需要存储时区信息,因为 DB-instance/server 的 TIMEZONE 与插入的所有数据相同。谢谢
  • 您从哪里获得这些值,您是否为此使用任何语言,或者您是否手动存储到数据库中?
  • @Noob 有趣的是,在 MySQL 5.7 中,您可以使用“T”作为日期和时间值之间的分隔符:2517-08-22T16:55:55
  • @Noob 我知道我可以通过修改数据来消除警告,但我正在寻找一种方法,而无需接触数据。例如设置数据库实例,使其在这种特定情况下忽略时区或不发出警告。我正在从 CSV 数据 (LOAD DATA LOCAL INFILE) 进行批量加载。
  • 我不确定这在技术上是否可行,我猜你应该检查 MySQL 文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2015-08-03
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多