MySQL时区

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

是否有MySQL时区的详尽列表?

似乎time_zone在MySQL中,设置依赖于主机操作系统,但我无法找到可能的值列表。

提问于
用户回答回答于

时区值可以以几种格式表示,但没有一种是区分大小写的: 值‘system’表示时区应与系统时区相同。 这个值可以作为一个字符串来给出,该字符串表示与UTC的偏移量,例如‘+10:00’或‘-06:00’。 该值可以作为命名时区,如“欧洲/赫尔辛基”、“美国/东方”或“MET”。只有在创建和填充MySQL数据库中的时区信息表时,才能使用命名时区。时间_带变量

应该注意的是,MySQL时区变量的默认设置是MySQL启动时的系统。系统值是从操作系统的全局值中获得的。时间_带环境变量

MySQL的默认值时区可以通过提供以下命令行选项,在启动时将变量初始化为不同的值:

--default-time-zone=timezone

或者,如果要在选项文件中提供值,则应使用以下语法设置变量:

--default-time-zone='timezone'

如果是MySQL超级用户,则可以设置系统时间_带在运行时使用以下语法从MySQL>提示符中选择变量:

SET GLOBAL time_zone=timezone;

MySQL还支持单独的会话。时区值,默认为全局值。时间_带环境变量值。更改会话时区值在会话期间使用以下语法:

SET time_zone=timezone;

为了询问现有的MySQL时区设置值时,可以执行以下SQL以获得这些值:

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

不管它的价值是什么,我只是在谷歌上搜索MySQL时间_区域配置有效值看了第一个结果。

用户回答回答于

默认情况下,(至少在基于Debian的安装上)不将时区数据加载到MySQL中。如果要测试它们是否已加载,请尝试执行:

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

如果它返回一个DATETIME(在这种情况下)2012-06-07 08:00:00),你已加载时区。如果它回来了NULL他们不是。当未加载时,仅限于使用偏移量进行转换(例如:+10:00-6:00)

在许多情况下,这应该是很好的,但是有时使用命名时区更好,比如不用担心夏时制。执行以下命令将从系统加载时区数据(Unix仅限)。我不知道什么是等价的Windows命令):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

如果需要持续依赖MySQL时区,请使用以下命令应该在每次更新系统时区时执行。也可以将其添加到每周或每月的cron作业中,以便自动完成。

然后,要查看时区列表,只需执行以下操作:

USE mysql;
SELECT * FROM `time_zone_name`;

注意,时区信息在MySQL中占用了大约5 MB。如果想卸载时区信息,只需执行以下命令并重新启动MySQL:

TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

不要DROP这些表否则坏事就会发生。


根据下面的用户注释,如果希望在更新系统时自动更新时区,则首先需要允许root用户登录,而无需提示输入密码。

MySQL>=5.6.6

mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL<5.6.6

创建一个~/.my.cnf文件(如果还不存在)并添加以下内容:

[client]
user=root
password=yourMysqlRootPW

然后执行chmod 600 ~/.my.cnf确保没有人能读懂它。

更新脚本

将以下脚本添加到crontab中,以便每天执行一次:

#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24   
# hours and do not have ".tab" in the name (since these are not timezone files) 
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
    echo "Updating MySQL timezone info"
    # Note, suppressing STDERR here because of the .tab files above
    # that cause warnings.
    mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
    echo "Done!\n"
fi

移除echo如果你不想要任何输出的话。

注意:这是(大部分)未经测试的。如果你有任何问题,请告诉我,我会更新这个答案。

扫码关注云+社区