在MySQL中使用NOW()时,我可以确定正确的UTC值将存储在TIMESTAMP列中吗?

VKK*_*VKK 6 mysql time date

MySQL有两种数据类型,专门用于存储日期和时间值 - DATETIMETIMESTAMP.两种类型都不存储时区信息,并且两者都有不同的规则.

DATETIME柱将存储在插入查询而提供准确的日期和时间值.(没有时间的转换和没有支持)

TIMESTAMP列将转换从在插入时间为UTC的连接的时区设置在插入的日期和时间值.在检索时,它会将从UTC存储的日期和时间值转换为检索连接的时区.可以根据这些规则显式或隐式地设置两个连接的时区.

在我回答我的问题之前,让我们看看处理夏令时的日期和时间的一些细微差别.总结另一个Stack Overflow问题的答案,以及我从MySQL文档中了解的有关日期/时间的内容:

  1. 使用DATETIME列并显式指定值(即/ 2009-11-01 01:30:00)时,该值可能不明确.DATETIME不执行任何对话,只需存储这个确切的日期/时间.说我在纽约(夏令时之后).在插入和检索时,我无法指示/知道此值是指在夏令时(UTC-4)的1:30 AM还是在非夏令时(UTC-5)的1:30 AM ).
  2. 当与DATETIME列一起使用时NOW(),NOW()在查询执行开始时评估日期和时间值(即/ 2009-11-01 01:30:00),并且在没有转换的情况下将该值插入到DATETIME字段中,从而导致与上述相同的模糊性.
  3. 当使用TIMESTAMP列并明确指定值(即/ 2009-11-01 01:30:00)时,我再次遇到与上述相同的问题.没有办法指明,也没办法知道我指的是凌晨1:30.

现在,这是我的问题:

鉴于被设定为包括夏令(比方说一个时区MySQL数据库连接America/New York),我可以肯定的是插入NOW()到一个TIMESTAMP柱将导致存储了正确的UTC时间和日期值?UTC当然不会观察夏令时,因此纽约时区凌晨1:30的UTC时间与夏令时不同于纽约时区凌晨1:30的UTC时间,没有夏令时.

更具体地说:在我从列中插入/选择时,在查询执行开始时连接时区的UTC偏移是用于执行to-UTC/from-UTC转换的内容TIMESTAMP吗?回到我的例子,在凌晨1:30,夏令America\New York时(时区)我在UTC-4和凌晨1:30没有夏令America\New York时(时区)我在UTC-5 -所以在这两个时刻,TIMESTAMP当我2009-11-01 01:30:00通过使用显式插入或隐式插入相同的值时,是否会在字段中存储不同的值NOW()?最后,如果我在跨越这两个瞬间的单个MySQL连接中,并且我执行两个查询(第一个时刻一个,第二个时刻另一个),两个查询是否会导致正确(不同)的UTC值要存储?

Ric*_*mes 3

您可能希望将其用于服务器:

mysql> SHOW VARIABLES LIKE '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |  -- Comes from OS
| time_zone        | SYSTEM |  -- Probably the 'right' setting
+------------------+--------+
Run Code Online (Sandbox Code Playgroud)

通过这些设置,SELECT NOW()将提供 UTC 时间,而不是本地时间。

对于您的个人计算机,最好有system_time_zone类似Pacific Daylight Time(或其他)的东西来反映您当前的位置。

INSERTingor SELECTingaDATE或 时不会DATETIME发生转换。将其视为时钟的图片。

对于TIMESTAMP,无论您提供什么,它都会转换为 UTC 或从 UTC 转换。也就是说,表中存储的位是UTC,但你看不到;您只能看到基于上述两个设置转换后的日期和时间。

我建议获得答案的最佳方法是创建一个包含 aDATETIME和 a 的表TIMESTAMP,设置这两个设置,然后看看存储时会发生什么。然后更改设置并执行SELECT.