关于mysql:Timestamp数据类型是否可以插入UTC时间而不是本地时间(System_time_Zone)

Can Timestamp datatype insert UTC time rather than the local time(System_time_Zone)

有没有一种方法,Timestamp可以插入UTC时间而不是本地时间(System_time_Zone)。

根据MySQL文档 -
"MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC转换回当前时区进行检索。"

当我在timestamp数据类型中插入now()时,保存的值是本地时间,与Datetime数据类型相同。 Datetime的日期值似乎是静态的,但TimeZone会在更新Session时区时不断更新。

MySQL Workbench 6.3查询 - 我目前处于EDT时区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
desc datedemo ;

--------------------------------------------------
| mydatetime        | 'datetime'              |
--------------------------------------------------
| mytimestamp       |'timestamp'              |
--------------------------------------------------
| utcdate           | datetime                |
--------------------------------------------------

SELECT @@global.time_zone, @@session.time_zone;

--------------------------------------------------
| @@global.time_zone|'@@session.time_zone'
--------------------------------------------------
| SYSTEM            | SYSTEM |
--------------------------------------------------

insert into datedemo values (now(), now(),UTC_TIMESTAMP());

select * from datedemo

----------------------------------------------------------------------
| mydatetime         | mytimestamp              | utcdate
----------------------------------------------------------------------
| 2017-06-21 16:20:28|  2017-06-21 16:20:28     |2017-06-21 20:20:28
----------------------------------------------------------------------

SET  SESSION TIME_ZONE ="+00:00"; // UTC time ZONE

select * from datedemo

----------------------------------------------------------------------
| mydatetime         | mytimestamp              | utcdate
----------------------------------------------------------------------
| 2017-06-21 16:20:28|  2017-06-21 20:20:28     |2017-06-21 20:20:28
----------------------------------------------------------------------

timeStamp数据类型在哪里保存UTC时间?根据我的理解,它只是使用会话timeZone并相应地转换时间,这也是由Datetime完成的,唯一的区别是datetime是静态的,但TimeStamp使用客户端timeZone继续移动。

我可能完全错了,但如果能回答这个问题,我将不胜感激。


来自MySQL文档:

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.)

无论您在DATETIME类型中添加什么值,都将完全保留您设置它的方式。

放入TIMESTAMP类型的值将在您存储时从会话时区转换为UTC。 然后,当您将其读回时,它会从UTC转换为会话时区。

如果您未在会话期间明确设置会话时区,则全局时区仅定义会话时区的设置。

通常,如果您知道要跨时区进行转换,请使用TIMESTAMP类型。 另一方面,如果您希望值始终与您放入的值完全相同,则无论会话时区如何,请使用DATETIME类型。

创建像CreatedUTC这样的字段完全有效,该字段始终以UTC格式编写和读取,并且是DATETIME类型。 但是,如果您信任会话时区将被正确使用,您可能更喜欢Created作为TIMESTAMP