本文介绍MySQL维护的时区设置——如何加载命名时间支持所需的系统表,如何及时了解时区变化,以及如何启用闰秒支持。
从MySQL 8.0.19开始,插入的日期时间值也支持时区偏移。
1 时区变量
MySQL Server维护了几个时区设置:
- 服务器系统时区。当服务器启动时,它会尝试确定主机的时区,并使用它来设置system_time_zone系统变量。
- 要在启动时明确指定MySQL Server的系统时区,请在启动mysqld之前设置TZ环境变量。如果使用mysqld_safe启动服务器,其--timezone选项提供了另一种设置系统时区的方法。TZ和--时区的允许值取决于系统。请参阅您的操作系统文档,了解哪些值是可接受的。
- 服务器当前时区。全局time_zone系统变量表示服务器当前运行的时区。初始time_zone值为“system”,表示服务器时区与系统时区相同。
注意:
如果设置为SYSTEM,则每个需要时区计算的MySQL函数调用都会进行系统库调用,以确定当前系统时区。此调用可能受到全局互斥的保护,从而导致争用。
初始全局服务器时区值可以在启动时使用命令行上的--default时区选项显式指定,也可以在选项文件中使用以下行:
default-time-zone='timezone'
如果您具有SYSTEM_VARIABLES_ADMIN权限(或不推荐使用的SUPER权限),则可以使用以下语句在运行时设置全局服务器时区值:
SET GLOBAL time_zone = timezone;
- 每个会话的时区。每个连接的客户端都有自己的会话时区设置,由会话time_zone变量给定。最初,会话变量的值取自全局time_zone变量,但客户端可以使用以下语句更改自己的时区:
SET time_zone = timezone;
会话时区设置会影响区分区域的时间值的显示和存储。这包括函数(如NOW()或CURTIME())显示的值,以及存储在TIMESTAMP列中和从中检索的值。TIMESTAMP列的值从会话时区转换为UTC用于存储,从UTC转换为会话时区用于检索。
会话时区设置不影响UTC_TIMESTAMP()等函数显示的值或DATE、time或DATETIME列中的值。这些数据类型中的值也不存储在UTC中;时区仅在从TIMESTAMP值转换时适用于它们。如果需要DATE、TIME或DATETIME值的特定于区域设置的算术运算,请将它们转换为UTC,执行算术运算,然后再转换回来。
当前全局和会话时区值可以这样检索:
SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
时区值可以用几种格式给出,它们都不区分大小写:
- 作为值“SYSTEM”,表示服务器时区与系统时区相同。
- 作为一个字符串,指示与UTC的偏移量,格式为[H]H:MM,前缀为+或-,如“+10:00”、“-6:00”或“+05:30”。前导零可以可选地用于小于10的小时值;在这种情况下,MySQL在存