有关复制设置中时区设置的信息,请参见第17.5.1.14节“复制和系统功能”和 第17.5.1.32节“复制和时区”。

本节介绍了MySQL维护的时区设置,如何加载命名时间支持所需的系统表,如何在时区更改时保持最新状态以及如何启用leap秒支持。

从MySQL 8.0.19开始,插入的datetime值也支持时区偏移量。有关更多信息,请参见第11.2.2节“ DATE,DATETIME和TIMESTAMP类型”。

时区变量

填充时区表

与时区变化保持同步

时区飞跃秒支持

有关复制设置中时区设置的信息,请参见第17.5.1.14节“复制和系统功能”和 第17.5.1.32节“复制和时区”。

时区变量

MySQL Server维护几个时区设置:

系统时区。服务器启动时,它将尝试自动确定主机的时区,并使用它来设置 system_time_zone系统变量。此后该值不变。

要在启动时为MySQL Server明确指定系统时区,请在启动mysqldTZ之前设置环境变量。如果使用mysqld_safe启动服务器,则其 选项提供了另一种设置系统时区的方法。对于允许值和 是取决于系统。请查阅操作系统文档,以了解可以接受的值。 --timezoneTZ–timezone

服务器当前时区。全局 time_zone系统变量指示服务器当前正在运行的时区。初始time_zone 值为’SYSTEM’,指示服务器时区与系统时区相同。

注意

如果设置为SYSTEM,则每个需要时区计算的MySQL函数调用都会进行系统库调用,以确定当前系统时区。该调用可能受到全局互斥锁的保护,从而导致争用。

初始全局服务器时区值可以在启动时通过–default-time-zone命令行中的选项显式指定 ,也可以在选项文件中使用以下行:

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;

timezone 值可以以几种格式给出,都不区分大小写:

作为值’SYSTEM’,指示服务器时区与系统时区相同。

作为表示一个字符串的从表单的UTC偏移 ,带有前缀或 ,例如, ,或。前导零可用于小于10的小时值;在这种情况下,MySQL在存储和检索该值时会加上前导零。MySQL的转换 或者到 。 [H]H:MM±’+10:00’’-6:00’’+05:30’’-00:00’’-0:00’’+00:00’

在此之前的MySQL 8.0.19,该值必须在范围 ‘-12:59’到’+13:00’,包容性; 与MySQL 8.0.19开始,允许范围为’-14:00’到 ‘+14:00’,包容性。

作为命名的时区,例如 ‘Europe/Helsinki’, 'US/Eastern’或 ‘MET’。仅当mysql已经创建并填充了数据库中的时区信息表时,才能使用命名时区 。

填充时区表

mysql系统架构中存在 几个表来存储时区信息(请参见 第5.3节“ mysql系统架构”)。MySQL安装过程会创建时区表,但不会加载它们。为此,请按照以下说明进行操作。

注意

加载时区信息不一定是一次性操作,因为该信息会偶尔更改。当发生此类更改时,使用旧规则的应用程序将过时,您可能会发现有必要重新加载时区表以使MySQL服务器使用的信息保持最新。请参阅 时区更改以保持最新。

如果您的系统有自己的 zoneinfo数据库(描述时区的文件集),请使用 mysql_tzinfo_to_sql程序加载时区表。此类系统的示例是Linux,macOS,FreeBSD和Solaris。这些文件的一个可能位置是 /usr/share/zoneinfo目录。如果您的系统没有zoneinfo数据库,则可以使用可下载的程序包,如本节后面所述。

要从命令行加载时区表,请将zoneinfo目录路径名传递到 mysql_tzinfo_to_sql并将输出发送到mysql程序。例如:

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

此处显示 的mysql命令假定您使用一个帐户(例如root具有修改mysql系统架构中的表的特权)连接到服务器 。根据需要调整连接参数。

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

mysql_tzinfo_to_sql也可以用于加载单个时区文件或生成leap秒信息:

要加载tz_file与时区名称相对应的单个时区文件 ,请像这样tz_name调用 mysql_tzinfo_to_sql:

mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql

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

如果您的时区必须占leap秒,请像这样初始化leap秒信息,其中 tz_file时区文件的名称为:

mysql_tzinfo_to_sql --leap tz_file | mysql -u root -p mysql

运行mysql_tzinfo_to_sql后,重新启动服务器,以使其不再继续使用任何以前缓存的时区数据。

如果您的系统没有zoneinfo数据库(例如Windows),则可以使用包含SQL语句的软件包,该软件包可从MySQL开发人员区域下载:

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

警告

难道不,如果你的系统有一个数据库时区信息使用一个可下载的时区包。请改用 mysql_tzinfo_to_sql实用程序。否则,可能会导致MySQL与系统上其他应用程序之间在日期时间处理上有所不同。

要使用已下载的SQL语句时区包,请对其进行解压缩,然后将解压缩的文件内容加载到时区表中:

mysql -u root -p mysql < file_name

然后重新启动服务器。

警告

千万不能使用包含一个可下载的时区包MyISAM桌。这适用于较旧的MySQL版本。MySQL现在 InnoDB用于时区表。尝试用MyISAM表替换它们会引起问题。

与时区变化保持同步

当时区规则更改时,使用旧规则的应用程序将过时。要保持最新状态,必须确保您的系统使用了当前时区信息。对于MySQL,要保持最新状态,需要考虑多个因素:

如果MySQL服务器的时区设置为,则操作系统时间会影响MySQL服务器使用的时间值 SYSTEM。确保您的操作系统使用最新的时区信息。对于大多数操作系统,最新的更新或Service Pack可为您的系统做好时间变化的准备。请在您的操作系统供应商的网站上查看有关时间更改的更新。

如果将系统的/etc/localtime时区文件替换为 使用与mysqld启动时生效的规则不同的规则的版本 ,请重新启动 mysqld,以使其使用更新后的规则。否则,mysqld可能不会注意到系统何时更改其时间。

如果您将命名时区与MySQL配合使用,请确保mysql数据库中的时区表是最新的:

如果您的系统具有自己的zoneinfo数据库,则每当zoneinfo数据库更新时,都重新加载MySQL时区表。

对于没有自己的zoneinfo数据库的系统,请检查MySQL开发人员区域以获取更新。当有新更新可用时,请下载并使用它来替换当前时区表的内容。

有关这两种方法的说明,请参见 填充时区表。 mysqld缓存它查找的时区信息,因此在更新时区表之后,重新启动 mysqld以确保它不会继续提供过时的时区数据。

如果不确定命名时区是否可用,用作服务器的时区设置还是由设置自己的时区的客户端使用,请检查时区表是否为空。以下查询确定包含时区名称的表是否具有任何行:

mysql> SELECT COUNT(*) FROM mysql.time_zone_name;

+----------+

| COUNT(*) |

+----------+

| 0 |

+----------+

计数为零表示该表为空。在这种情况下,当前没有应用程序在使用命名时区,并且您不需要更新表(除非您要启用命名时区支持)。大于零的计数表示该表不为空,并且其内容可用于命名时区支持。在这种情况下,请确保重新加载时区表,以便使用命名时区的应用程序将获得正确的查询结果。

要检查您的MySQL安装是否已正确更新以适应夏令时规则,请使用以下测试。本示例使用的值适用于3月11日凌晨2点在美国发生的2007 DST 1小时更改

测试使用以下查询:

SELECT

CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') AS time1,

CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') AS time2;

这两个时间值指示DST发生更改的时间,并且使用命名时区要求使用时区表。理想的结果是两个查询都返回相同的结果(输入时间,在“美国/中央”时区中转换为等效值)。

在更新时区表之前,您会看到如下错误结果:

+---------------------+---------------------+

| time1 | time2 |

+---------------------+---------------------+

| 2007-03-11 01:00:00 | 2007-03-11 02:00:00 |

+---------------------+---------------------+

更新表后,您应该看到正确的结果:

+---------------------+---------------------+

| time1 | time2 |

+---------------------+---------------------+

| 2007-03-11 01:00:00 | 2007-03-11 01:00:00 |

+---------------------+---------------------+

时区飞跃秒支持

返回的second秒值的时间部分以结尾 :59:59。这意味着as之类的函数 NOW()可以在the秒内连续两三秒返回相同的值。具有时间部分结尾:59:60或被 :59:61认为无效的文字时间值仍然是正确的。

如果有必要TIMESTAMP在leap秒之前一秒钟搜索 值,则使用与值的比较可能会获得异常结果。以下示例对此进行了演示。它将会话时区更改为UTC,因此内部值(位于UTC中)和显示的值(已应用时区校正)之间没有区别 。 'YYYY-MM-DD hh:mm:ss’TIMESTAMP

mysql> CREATE TABLE t1 (

a INT,

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (ts)

);

Query OK, 0 rows affected (0.01 sec)

mysql> -- change to UTC

mysql> SET time_zone = '+00:00';

Query OK, 0 rows affected (0.00 sec)

mysql> -- Simulate NOW() = '2008-12-31 23:59:59'

mysql> SET timestamp = 1230767999;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t1 (a) VALUES (1);

Query OK, 1 row affected (0.00 sec)

mysql> -- Simulate NOW() = '2008-12-31 23:59:60'

mysql> SET timestamp = 1230768000;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t1 (a) VALUES (2);

Query OK, 1 row affected (0.00 sec)

mysql> -- values differ internally but display the same

mysql> SELECT a, ts, UNIX_TIMESTAMP(ts) FROM t1;

+------+---------------------+--------------------+

| a | ts | UNIX_TIMESTAMP(ts) |

+------+---------------------+--------------------+

| 1 | 2008-12-31 23:59:59 | 1230767999 |

| 2 | 2008-12-31 23:59:59 | 1230768000 |

+------+---------------------+--------------------+

2 rows in set (0.00 sec)

mysql> -- only the non-leap value matches

mysql> SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:59';

+------+---------------------+

| a | ts |

+------+---------------------+

| 1 | 2008-12-31 23:59:59 |

+------+---------------------+

1 row in set (0.00 sec)

mysql> -- the leap value with seconds=60 is invalid

mysql> SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:60';

Empty set, 2 warnings (0.00 sec)

要解决此问题,您可以基于实际存储在列中的UTC值进行比较,并应用秒修正:

mysql> -- selecting using UNIX_TIMESTAMP value return leap value

mysql> SELECT * FROM t1 WHERE UNIX_TIMESTAMP(ts) = 1230768000;

+------+---------------------+

| a | ts |

+------+---------------------+

| 2 | 2008-12-31 23:59:59 |

+------+---------------------+

1 row in set (0.00 sec)

mysql支持的时区列表_5.1.14 MySQL服务器时区支持相关推荐

  1. java 时区 列表_浅解 JAVA与时区

    时区转换 主要介绍一下 Java 时区转换相关的一些概念,和转换示例. 由于夏令时的存在,应该通过Java 或者 DB 提供的方法来转换. JAVA 时间的时区转换 Java Date 支持 UTC ...

  2. mysql date timestamp_【Mysql】Datetime和Timestamp区别,及mysql中各种时间的使用

    说到数据库时间类型,大部分同学都会想到date.datetime.timestamp之类的. 我之前在项目遇到一个问题,测试同事在测试时,由于会测试205几年的数据,在入库时会抛出数据库异常,原因就是 ...

  3. mysql支持啥系统_MySQL支持的操作系统列表MySQL综合 -电脑资料

    我们使用GNU Autoconf,因此将MySQL移植到所有使用Posix线程和C++编译器的现代系统是可能的, 已经报告MySQL可以在下列操作系统/线程包的组合上成功地进行编译.注意,对于很多操作 ...

  4. 《MySQL 8.0 参考手册》第 14 章 MySQL 数据字典

    文章目录 14.1 数据字典模式 数据字典升级过程 使用 MySQL 调试版本查看数据字典表 14.2 删除基于文件的元数据 14.3 事务型数据字典 14.4 数据字典缓存 14.5 INFORMA ...

  5. mysql timestamp 当前_时区信息记录表|全方位认识 mysql 系统库

    作者  罗小波 · 沃趣科技高级数据库技术专家 出品  沃趣科技 在上一期<优化器成本记录表|全方位认识 mysql 系统库>中,我们详细介绍了mysql 系统库中的优化器成本记录表,本期 ...

  6. VS2010-2015对C++11/14/17特性的支持

    VS2010-2015对C++11/14/17特性的支持 C++11 功能列表 Visual C++ 实现了 C++11 核心语言规范 中的绝大多数功能.许多 C++14 库功能和某些为 C++17 ...

  7. mysql操作日志记录查询_详解mysql数据库参数log_timestamps--控制日志记录使用的时区...

    概述 最近发现之前安装的MySQL 5.7.27,其中的error log.general log日志里面日志时间的时区不对. 思路: mysql 5.7.2新增了参数 log_timestamps, ...

  8. 实验2-3-3 信号处理总结以及Linux下支持的信号列表

    一.例子 1.代码: 2.编译后运行如下: 可以看出进程正在等待信号SIGBUS 3.发送SIGBUS信号---用kill 首先我们看一下kill用法:在终端输入man kill,得: 于是我们就可以 ...

  9. mysql修改系统日期_修改系统和MySQL时区

    修改时间时区比想象中要简单: 各版本系统通用的方法 # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # cp /usr/share/zone ...

  10. 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述

    最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述 14.1.1 什么是存储过程 14.1.2 特性 [黑马程序员MySQL知识精讲+my ...

最新文章

  1. python 生成器 迭代器 yiled
  2. 单选框-复选框重置的方法
  3. mybatis中使用mysql的模糊查询字符串拼接(like)
  4. PHP-Codeigniter:实习笔记1
  5. Storm 06_Storm 容错机制
  6. 宝塔linux面板假设nextcloud,宝塔面板部署NextCloud(14.0.3)逐一解决后台安全及设置警告...
  7. kettle mysql_KETTLE7如何连接MYSQL8?
  8. nyoj 1321信息战(九)——水淹七军(搜索bfs)
  9. 2018-04-28
  10. 11_使用ehcache缓存进行商品分类展示优化
  11. 学生宿舍管理系统概要设计说明书
  12. 缩略图-快速开始(GraphicsMagick )
  13. 塑造元宇宙未来的5项技术
  14. 【机器学习】手写数字识别学习笔记(对三篇文件进行分析记录)
  15. 要点初见:从旅行青蛙开始的OpenCV3模板匹配功能探索
  16. 我,阿里的程序员,工作5年,揭秘阿里员工的真实收入和工作经历
  17. java返回空对象-空数组-空字符-null
  18. 日本东京艺术大学入学条件2019新盘点
  19. ios 16 beta 降级 15.5 实录
  20. 软件自动更新解决方案及QT实现(源码已上传)

热门文章

  1. php shopnc.dll,shopnc开发手册-ZX版.doc
  2. Debezium报错处理系列一:The db history topic is missing.
  3. 教你设置让电脑每天在指定时间自动关机
  4. info There appears to be trouble with your network connection. Retrying
  5. 计算机局域网组网技术的核心技术,自考“局域网技术与组网工程”模拟题(6)
  6. selenium driver关闭
  7. 转载:日本动漫发展史(新浪网)
  8. win10服务器怎么备份系统,详细教你win10怎么备份系统
  9. nox模拟器(安卓5.1)adb连接
  10. 【车间调度】基于matlab帝国企鹅算法求解柔性车间调度问题【含Matlab源码 1991期】