MySQL Server时区支持

本文介绍MySQL维护的时区设置——如何加载命名时间支持所需的系统表,如何及时了解时区变化,以及如何启用闰秒支持。

从MySQL 8.0.19开始,插入的日期时间值也支持时区偏移。

1 时区变量

MySQL Server维护了几个时区设置:

  • 服务器系统时区。当服务器启动时,它会尝试确定主机的时区,并使用它来设置system_time_zone系统变量。
  • 要在启动时明确指定MySQL Server的系统时区,请在启动mysqld之前设置TZ环境变量。如果使用mysqld_safe启动服务器,其--timezone选项提供了另一种设置系统时区的方法。TZ和--时区的允许值取决于系统。请参阅您的操作系统文档,了解哪些值是可接受的。
  • 服务器当前时区。全局time_zone系统变量表示服务器当前运行的时区。初始time_zone值为“system”,表示服务器时区与系统时区相同。

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

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

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;

时区值可以用几种格式给出,它们都不区分大小写:

  1. 作为值“SYSTEM”,表示服务器时区与系统时区相同。
  2. 作为一个字符串,指示与UTC的偏移量,格式为[H]H:MM,前缀为+或-,如“+10:00”、“-6:00”或“+05:30”。前导零可以可选地用于小于10的小时值;在这种情况下,MySQL在存储和检索值时会预加一个前导零。MySQL将“-00:00”或“-0:00”转换为“+00:00”。
  3. 在MySQL 8.0.19之前,此值必须在“-12:59”到“+13:00”之间(包括在内);从MySQL 8.0.19开始,允许的范围是“-13:59”到“+14:00”,包括在内。
  4. 作为命名时区,如“欧洲/赫尔辛基”、“美国/东方”、“MET”或“UTC”。

只有当mysql数据库中的时区信息表已经创建并填充时,才能使用命名时区。否则,使用命名时区会导致错误:

mysql> SET time_zone = 'UTC';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'UTC'

2 填充时区表

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还可以用于加载单个时区文件或生成闰秒信息:

  • 要加载与时区名称tz_name对应的单个时区文件tz_file,请调用mysql_tzinfo_To_sql,如下所示:
mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql

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

  • 如果您的时区必须考虑闰秒,请初始化闰秒信息,如下所示,其中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

注意:

如果您的系统有zoneinfo数据库,请不要使用可下载的时区包。请改用mysql_tzinfo_to_sql实用程序。否则,您可能会导致MySQL和系统上其他应用程序在日期时间处理方面存在差异。

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

mysql -u root -p mysql < file_name

然后重新启动服务器。

警告:
不要使用包含MyISAM表的可下载时区包。这适用于较旧的MySQL版本。MySQL现在使用InnoDB作为时区表。尝试用MyISAM表替换它们会导致问题。

3 随时了解时区变化

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

  • 如果MySQL服务器的时区设置为system,则操作系统时间会影响其使用的时间值。请确保您的操作系统使用的是最新的时区信息。对于大多数操作系统,最新的更新或service pack会为系统的时间变化做好准备。请查看操作系统供应商的网站,以获取解决时间更改的更新。
  • 如果将系统的/etc/localtime zone文件替换为使用与mysqld启动时有效的规则不同的规则的版本,请重新启动mysqld,使其使用更新的规则。否则,当系统更改时间时,mysqld可能不会注意到。
  • 如果您在MySQL中使用命名时区,请确保MySQL数据库中的时区表是最新的:
  1. 如果您的系统有自己的zoneinfo数据库,请在更新zoneinfo时重新加载MySQL时区表。
  2. 对于没有自己的zoneinfo数据库的系统,请查看MySQL开发区以获取更新。当有新的更新可用时,请下载并使用它来替换当前时区表的内容。

mysqld缓存它查找的时区信息,因此在更新时区表后,重新启动mysqld以确保它不会继续提供过时的时区数据。

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

mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+

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

要检查MySQL安装是否已针对夏令时规则的更改进行了正确更新,请使用以下测试。此示例使用的值适用于美国3月11日凌晨2点发生的2007夏令时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;

这两个时间值表示夏令时更改发生的时间,使用命名时区需要使用时区表。所需的结果是,两个查询都返回相同的结果(输入时间,转换为“美国/中部”时区中的等效值)。

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

+---------------------+---------------------+
| 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 |
+---------------------+---------------------+

4 时区闰秒支持

闰秒值返回的时间部分以:59:59结束。这意味着像NOW()这样的函数可以在闰秒期间连续两三秒返回相同的值。确实,时间部分以:59:60或:59:61结尾的文字时间值被视为无效。

如果有必要在闰秒前一秒搜索TIMESTAMP值,如果将其与“YYYY-MM-DD hh:MM:ss”值进行比较,则可能会获得异常结果。下面的示例演示了这一点。它将会话时区更改为UTC,因此内部TIMESTAMP值(以UTC为单位)和显示值(已应用时区校正)之间没有差异。

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表&#xff1a;是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括&#xff1a;客户信息、交易记录、产品数据、财务数据等。 做个比喻吧&#xff1a;数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

python中的文件

1.什么是文件&#xff1f; 硬盘上存储的数据都是以文件的形式来组织的~ 文件是数据在硬盘上的存储形式&#xff0c;不同的数据在硬盘上的存储形式是不同的&#xff0c; 2.文件路径 文件夹/目录。 文件夹&#xff0c;再包含文件夹的情况&#xff0c;这就是一个嵌套的关系&…

顺序表--数据结构第一关

顺序表 数据结构概念 定义&#xff1a;数据结构是计算机存储、组织数据的⽅式 根据学过C语言的基础上&#xff0c;数组是最简单的数据结构 顺序表的底层就是数组 为什么呢&#xff1f; 例子如下&#xff1a; int arr[100]{1,2,3,4,5}; //修改某一个数据&#xff1a;arr[…

电子部件烧录流程(仅供参考)

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 部件烧录流程的详细步骤 1. 准备工作 2. 连接硬件 3. 配置烧录软件 4. 校验和设置 5. 开始烧录 6. 验证和测试 7. 断开…

吉利银河L6 AQS空气质量监控系统

结论 顶配才有AQS 开启空调且auto模式 则默认开启AQS 无法关闭AQS AQS的作用 银河L6 AQS触发 和 图标 AQS官方配置参数 官方文档 吉利用户手册

机器学习基础概念

1.机器学习定义 2.机器学习工作流程 &#xff08;1&#xff09;数据集 ①一行数据&#xff1a;一个样本 ②一列数据&#xff1a;一个特征 ③目标值&#xff08;标签值&#xff09;&#xff1a;有些数据集有目标值&#xff0c;有些数据集没有。因此数据类型由特征值目标值构成或…

数据结构与算法笔记:实战篇 - 剖析微服务接口鉴权限流背后的数据结构和算法

概述 微服务是最近几年才兴起的概念。简单点将&#xff0c;就是把复杂的大应用&#xff0c;解耦成几个小的应用 。这样做的好处有很多。比如&#xff0c;这样有利于团队组织架构的拆分&#xff0c;比较团队越大协作的难度越大&#xff1b;再比如&#xff0c;每个应用都可以独立…

程序算法设计分析

动态规划和分治、贪心相比有什么区别&#xff1f;各自的优缺点&#xff1f; 分治算法特征&#xff1a; 1&#xff09;规模如果很小&#xff0c;则很容易解决。//一般问题都能满足 2&#xff09;大问题可以分为若干规模小的相同问题。//前提 3&#xff09;利用子问题的解&#x…

最靓丽的C++开源通知弹框SnoreToasts自动监听软件及网页通知

SnoreToasts&#xff0c;作为一款轻量级的C开源项目&#xff0c;为开发者提供了一个便捷的方式来在Windows操作系统上展示通知弹框&#xff08;Toast Notifications&#xff09;。 特点与优势 轻量级&#xff1a;SnoreToasts采用了简洁的代码设计&#xff0c;避免了不必要的依…

苹果可能与谷歌大模型合作,马斯克xAI下个月推出Grok-2,比尔·盖茨:Scaling Law快要走到尽头

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 1、苹果被曝 Gemini 模型今秋或融入苹果智能生态系统 苹果知名爆料人马克古尔曼&#xff08;Mark Gurman&#xff09;最新透露&#xff0c;苹果公司将于今年秋季宣布与Alphabet旗下的谷歌的大模型Gem…

电流传感器技术详解,你都懂吗?

在任何过程中&#xff0c;电量的测量对于监控、分析和控制系统都是必不可少的。要执行这些类型的测量&#xff0c;必须使用电流传感器。除非可以测量&#xff0c;否则无法管理物理量。让我们深入了解电流传感器的行为。 电流传感器 电流传感器是将电流信号转换为另一个可分析…

PyTorch计算机视觉实战:目标检测、图像处理与深度学习

本书基于真实数据集&#xff0c;全面系统地阐述现代计算机视觉实用技术、方法和实践&#xff0c;涵盖50多个计算机视觉问题。全书分为四部分&#xff1a;一部分介绍神经网络和PyTorch的基础知识&#xff0c;以及如何使用PyTorch构建并训练神经网络&#xff0c;包括输入数据缩放…

从零到一:全面掌握模板机部署与虚拟机克隆的实训指南【实训Day01】

一、模板机的部署 1.设置好子网ip和子网掩码以及网关 保证有NAT模式 子网IP着重记住前三段&#xff1a;192.168.222.xxx 2.开始建立虚拟机 注意&#xff1a;路径中不要有中文 3.安排8个内核 4.安排2GB内存 创建初步成功&#xff0c;接着 5.开启此虚拟机 6.选择中文 7.日期&…

好展位,抢先订!2024年亚洲(泰国) 国际电力能源展

2024年亚洲&#xff08;泰国&#xff09; 国际电力能源展 Powerex Asia & Electric Asia 2024 ▏发电设备 ▏输配电 ▏电网 ▏太阳能光伏 ▏储能 ▏氢能 ▏生物能源 ▏风能 ▏智慧能源 ▏ 能源部官方批复亚洲重点电力及新能源展 展会时间&#xff1a;2024 年 10 月 16-…

R可视化数据必要格式——长格式

一、引言 我们在对数据进行可视化时遇到最头疼、最常见的问题是什么&#xff1f;数据问题。 因为我们往往不会从零自己编程进行可视化&#xff0c;往往是现有模板或积累&#xff0c;而正确的数据格式对应正确的图形包要求&#xff0c;一定会正确出图&#xff0c;所以只有一个问…

鸿蒙开发设备管理:【@ohos.settings (设置数据项名称)】

设置数据项名称 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块提供设置数据项的访问功能相关接口的说明及示例。 导入模块 import settings from ohos.settings;settings.getUri…

Pointnet++改进即插即用系列:全网首发GLSA聚合和表示全局和局部空间特征|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入GLSA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理论介…

Java中==和equals()的区别

Java中和equals&#xff08;&#xff09;的区别 1、操作符2、equals()方法3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;和equals()是两个常用的比较操作符和方法&#xff0c;但它们之间的用法和含义却有着本…

GPT-5即将登场:AI赋能下的未来工作与日常生活新图景

随着OpenAI首席技术官米拉穆拉蒂在近期采访中的明确表态&#xff0c;GPT-5的发布已不再是遥不可及的梦想&#xff0c;而是即将在一年半后与我们见面的现实。这一消息无疑在科技界乃至全社会引发了广泛关注和热烈讨论。从GPT-4到GPT-5的飞跃&#xff0c;被形容为从高中生到博士生…

03.C1W2.Sentiment Analysis with Naïve Bayes

目录 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…