MySQL时区

时间:2012-03-21 15:51:13

标签: mysql timezone

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

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

我需要时间来展示卡尔加里当地时间。

7 个答案:

答案 0 :(得分:42)

默认情况下(至少在基于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

执行以下[source]:

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以确保没有其他人可以阅读它。

更新脚本<​​/ h2>

将以下脚本添加到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行。

注意:这(大多数情况下)未经测试。如果您有任何问题,请告诉我,我会更新此答案。

答案 1 :(得分:18)

来自the MySQL 5.7 documentation(强调我的):

  

时区值可以以多种格式给出,其中没有一种格式   区分大小写:

     

值'SYSTEM'表示时区应该与。相同   系统时区。

     

该值可以作为表示与UTC的偏移量的字符串给出,例如   为'+10:00'或'-6:00'。

     

该值可以作为命名时区给出,例如   'Europe / Helsinki','US / Eastern'或'MET'。 指定的时区可以   仅在mysql数据库中的时区信息表时使用   已创建并填充。

应该注意MySQL timezone 变量的默认设置是MySQL启动时的SYSTEM。 SYSTEM值是从操作系统设置获得的(例如,从符号链接/etc/localtime引用的文件中获取)

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

--default-time-zone=timezone

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

--default-time-zone='timezone'

如果您是MySQL SUPER用户,可以在运行时从MYSQL&gt;设置SYSTEM time_zone 变量。使用以下语法提示:

SET GLOBAL time_zone=timezone;

MySQL还支持单个SESSION timezone 值,默认为GLOBAL time_zone 环境变量值。要在SESSION期间更改会话 timezone 值,请使用以下语法:

SET time_zone=timezone;

为了询问现有的MYSQL timezone 设置值,您可以执行以下SQL来获取这些值:

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

为了它的价值,我只需用Google搜索 mysql time_zone配置有效值并查看第一个结果。

答案 2 :(得分:4)

我已经开始并创造了一个要点。

<击> https://gist.github.com/4134305

https://gist.github.com/kinjal/9105369

我希望人们觉得它很有用。

答案 3 :(得分:3)

一个详尽的时区列表可以从MySQL的网站downloaded作为导入MySQL服务器的数据库表。

对于卡尔加里时间,您可以将UTC offsets指定为

set time_zone = '-6:00';

答案 4 :(得分:1)

您可以运行此查询以获取MySQL支持的时区的完整列表:

SELECT Name
FROM mysql.time_zone_name
ORDER BY Name

(在此页上找到:https://www.plumislandmedia.net/mysql/time-zones-mysql/

答案 5 :(得分:0)

应该注意MySQL时区变量的默认设置是MySQL启动时的SYSTEM。 SYSTEM值是从操作系统的GLOBAL time_zone环境变量中获得的。

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

--default-time-zone=timezone

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

--default-time-zone='timezone'

如果您是MySQL SUPER用户,可以在运行时从MYSQL&gt;设置SYSTEM time_zone变量。使用以下语法提示:

SET GLOBAL time_zone=timezone;

MySQL还支持单个SESSION时区值,默认为GLOBAL time_zone环境变量值。要在SESSION期间更改会话时区值,请使用以下语法:

SET time_zone=timezone;

为了询问现有的MYSQL时区设置值,您可以执行以下SQL来获取这些值:

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

答案 6 :(得分:-3)

唯一的答案: http://timezonedb.com/download

使此答案有效的文字