MySQL服务器维护几个时区设置:


  • 系统时区。当服务器启动时,它会尝试确定主机的时区并使用它来设置system_time_zone系统变量。该值此后不会改变。
    您可以在启动时使用mysqld_safe 选项为MySQL服务器设置系统时区 。您也可以在启动mysqld之前通过设置环境变量来设置它。对于允许值或 是取决于系统。请查阅您的操作系统文档以查看可接受的值。 --timezone=timezone_nameTZ--timezoneTZ
  • 服务器的当前时区。全局 time_zone系统变量指示服务器当前正操作的时区。为初始值 time_zone是 'SYSTEM',其指示该服务器时区是相同的系统时区。
    注意如果设置为SYSTEM,则每个需要时区计算的MySQL函数调用都会调用系统库来确定当前系统时区。此调用可能受全局互斥体保护,导致争用。
    初始全局服务器时区值可以在启动时通过 命令行上的选项显式指定 ,也可以在选项文件中使用以下行: --default-time-zone=timezone
default-time-zone='timezone'

如果您拥有 SYSTEM_VARIABLES_ADMIN或 SUPER特权,则可以使用以下语句在运行时设置全局服务器时区值:

mysql> SET GLOBAL time_zone = timezone;
mysql> SET GLOBAL time_zone = timezone;
  • 每连接时区。每个连接的客户端都有自己的时区设置,由会话time_zone变量给出 。最初,会话变量从全局变量中获取其值time_zone,但客户端可以使用以下语句更改其自己的时区:
mysql> SET time_zone = timezone;
mysql> SET time_zone = timezone;


当前会话时区设置会影响对区域敏感的时间值的显示和存储。这包括诸如NOW()或 的函数显示的值 CURTIME(),以及存储在TIMESTAMP列中并从列中检索的值。TIMESTAMP列的值从当前时区转换为UTC存储,并从UTC转换到当前时区以供检索。

当前时区设置不影响由功能显示的值,如UTC_TIMESTAMP() 在或值DATE, TIME或 DATETIME列。这些数据类型中的值也不以UTC存储; 时区仅适用于从TIMESTAMP值转换时。如果你想区域特定算术 DATE, TIME或 DATETIME值,将其转换为UTC,执行算术,然后再转换回。

全局和客户特定时区的当前值可以像这样获取:

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


timezone 值可以用几种格式给出,其中没有一个是区分大小写的:

  • 该值'SYSTEM'表示时区应该与系统时区相同。
  • 该值可以以字符串的形式给出,指示与UTC的偏移量,如'+10:00'或 '-6:00'
  • 该值可以被给定为指定的时间区,如 'Europe/Helsinki', 'US/Eastern',或'MET'。只有在mysql数据库中的时区信息表已被创建并填充后,才能使用命名时区。


填充时区表

mysql系统数据库中有 多个表用于维护时区信。MySQL安装过程创建时区表,但不加载它们。您必须使用以下说明手动执行此操作。


注意



加载时区信息不一定是一次性操作,因为信息偶尔会改变。发生此类更改时,使用旧规则的应用程序将变得过时,并且您可能会发现需要重新加载时区表以使MySQL服务器使用的信息保持最新状态。请参阅本节末尾的注释。



如果您的系统具有自己的 zoneinfo数据库(描述时区的文件集),则应使用 mysql_tzinfo_to_sql程序填充时区表。这样的系统的例子是Linux,FreeBSD,Solaris和OS X.这些文件的一个可能位置是 /usr/share/zoneinfo目录。如果您的系统没有zoneinfo数据库,则可以使用本节后面所述的可下载软件包。




该mysql_tzinfo_to_sql程序用于装载时区表。在命令行上,将zoneinfo目录路径名称传递给mysql_tzinfo_to_sql并将输出发送到mysql程序。例如:


shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql


读取您系统的时区文件并从中生成SQL语句。 mysql处理这些语句来加载时区表。


 


 也可用于加载单个时区文件或生成闰秒信息:要加载tz_file与时区名称对应的单个时区文件 ,请像这样tz_name调用


shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql

采用这种方法,您必须执行单独的命令来加载服务器需要了解的每个命名区域的时区文件。

  • 如果您的时区需要考虑闰秒,请像这样初始化闰秒信息,其中 

tz_file

  • 是您的时区文件的名称:
shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
  • 在运行mysql_tzinfo_to_sql之后,最好重新启动服务器,以便它不会继续使用任何先前缓存的时区数据。


如果您的系统没有zoneinfo数据库(例如Windows),那么您可以使用可在MySQL Developer Zone上下载的软件包:


http://dev.mysql.com/downloads/timezones.html


下载包含SQL语句的时区包并将其解压缩,然后将包文件内容加载到时区表中:


shell> mysql -u root mysql < file_name


然后重新启动服务器。


警告



千万不能使用包含一个可下载的包MyISAM桌。MySQL InnoDB用于时区表。试图用MyISAM表替换它们会导致问题。


警告



如果您的系统有zoneinfo数据库,请不要使用可下载的软件包。改用mysql_tzinfo_to_sql工具。否则,您可能会在MySQL和系统上的其他应用程序之间的日期时间处理方面产生差异。