MySQL时区

Gar*_*ary 22 mysql timezone

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

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

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

Mik*_*ike 44

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

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Run Code Online (Sandbox Code Playgroud)

如果它返回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
Run Code Online (Sandbox Code Playgroud)

如果您需要不断依赖MySQL时区,则每次更新系统时区时都应执行上述命令.您也可以将其添加到每周或每月的cron作业中,以便自动为您完成.

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

USE mysql;
SELECT * FROM `time_zone_name`;
Run Code Online (Sandbox Code Playgroud)

请注意,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` ;
Run Code Online (Sandbox Code Playgroud)

不要DROP这些表或坏事会发生.


编辑:

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

MySQL> = 5.6.6

执行以下[ source ]:

mysql_config_editor set --login-path=client --host=localhost --user=root --password
Run Code Online (Sandbox Code Playgroud)

MySQL <5.6.6

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

[client]
user=root
password=yourMysqlRootPW
Run Code Online (Sandbox Code Playgroud)

然后执行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
Run Code Online (Sandbox Code Playgroud)

echo如果您不想要任何输出,请删除这些行.

注意:这(大部分)未经测试.如果您有任何问题,请告诉我,我会更新此答案.

  • 这是有关该主题的最丰富的帖子之一.谢谢迈克! (5认同)

Bri*_*oll 19

MySQL 5.7文档(强调我的):

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

值"SYSTEM"表示时区应与系统时区相同.

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

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

需要注意的是MySQL 时区变量的默认设置是MySQL启动的SYSTEM.SYSTEM值是从操作系统设置获得的(例如,从符号链接引用的文件/etc/localtime)

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

--default-time-zone=timezone
Run Code Online (Sandbox Code Playgroud)

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

--default-time-zone='timezone'
Run Code Online (Sandbox Code Playgroud)

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

SET GLOBAL time_zone=timezone;
Run Code Online (Sandbox Code Playgroud)

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

SET time_zone=timezone;
Run Code Online (Sandbox Code Playgroud)

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

SELECT @@global.time_zone, @@session.time_zone;
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*ean 5

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

SELECT Name
FROM mysql.time_zone_name
ORDER BY Name
Run Code Online (Sandbox Code Playgroud)

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