Timestamp是否可以插入UTC时间而不是本地时间(System_time_Zone)。
根据MySQL文档 - " MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC转换回当前时区进行检索。"
当我在timestamp数据类型中插入now()时,保存的值是本地时间,与Datetime数据类型相同。对于Datetime,日期值似乎是静态的,但TimeZone会在更新会话时区时不断更新。
MySQL Workbench 6.3查询 - 我目前处于EDT时区。
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继续移动。
我可能完全错了,但如果能回答这个问题,我将不胜感激。
答案 0 :(得分:1)
MySQL将
TIMESTAMP
值从当前时区转换为UTC进行存储,然后从UTC返回到当前时区进行检索。 (对于其他类型,例如DATETIME
,不会发生这种情况。)
您在DATETIME
类型中输入的任何值都将完全按照您的设置方式保留。
您存储到TIMESTAMP
类型的值将在您存储时从会话时区转换为UTC。然后,当您将其读回时,它会从UTC转换为会话时区。
如果您未在会话期间明确设置会话时区,则全局时区仅定义会话时区的设置。
通常,如果您知道要跨时区进行转换,请使用TIMESTAMP
类型。另一方面,如果您希望值始终与您输入的内容完全相同,则无论会话时区如何,请使用DATETIME
类型。
创建像CreatedUTC
这样的字段完全有效,该字段始终以UTC格式编写和读取,并且是DATETIME
类型。但是,如果您信任会话时区将被正确使用,您可能会更喜欢Created
作为TIMESTAMP
。