热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL是否应该将其时区设置为UTC?

MySQL是否应该将

只要您为当前时区设置了正确的时间,知道您存储的日期时间列的时区,并且知道夏令时的问题,服务器上的时区似乎并不重要。

另一方面,如果您可以控制所使用服务器的时区,那么您可以在内部将所有内容设置为 UTC,而不必担心时区和 DST,至少在存储内部时间方面是这样。

以下是我收集的一些关于如何使用时区作为我自己和其他人的备忘单形式的笔记,这可能会影响人们将为他/她的服务器选择哪个时区以及他/她将如何存储日期和时间。

MySQL 时区备忘单

笔记:


  1. 更改时区 ,但会从时间戳列中选择不同的日期时间


  2. UTC 有闰秒,这些看起来像 ‘2012-06-30 23:59:60’ 并且可以随机添加,由于地球自转速度减慢,提前 6 个月通知


  3. GMT 混淆了秒数,这就是发明 UTC 的原因。


  4. 由于夏令时,不同的区域时区可能会产生相同的日期时间值


  5. 由于限制,时间戳列仅支持日期 1970-01-01 00:00:01 到 2038-01-19 03:14:07 UTC 。


  6. MySQL 时间戳列在内部存储为UTC,但在选择日期时,MySQL 会自动将其转换为当前会话时区。


在时间戳中存储日期时,MySQL 将假定日期在当前会话时区中,并将其转换为 UTC 进行存储。


  1. MySQL 可以在日期时间列中存储部分日期,这些看起来像“2013-00-00 04:00:00”


  2. 如果您将日期时间列设置为 NULL,MySQL 将存储“0000-00-00 00:00:00”,除非您在创建该列时专门设置该列以允许为空。



选择 UTC 格式的时间戳列

无论当前 MySQL 会话在哪个时区:

SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`

您还可以将服务器或全局或当前会话时区设置为 UTC,然后选择时间戳,如下所示:

SELECT `timestamp_field` FROM `table_name`

要选择 UTC 中的当前日期时间:

SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');

示例结果:2015-03-24 17:02:41

在会话时区中选择当前日期时间

SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();

选择服务器启动时设置的时区

SELECT @@system_time_zone;

返回莫斯科时间的“MSK”或“+04:00”,例如,存在(或曾经)一个 MySQL 错误,如果设置为数字偏移量,它将不会调整夏令时

获取当前时区

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

如果您的时区是 +2:00,它将返回 02:00:00。

获取当前 UNIX 时间戳(以秒为单位):

SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();

获取时间戳列作为 UNIX 时间戳

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

获取 UTC 日期时间列作为 UNIX 时间戳

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`

从正 UNIX 时间戳整数获取当前时区日期时间

SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`

从 UNIX 时间戳获取 UTC 日期时间

SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00')
FROM `table_name`

从负 UNIX 时间戳整数中获取当前时区日期时间

SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)

在 MySQL 中有 3 个地方可以设置时区:

注意:时区可以设置为 2 种格式:


  1. 与 UTC 的偏移量:“+00:00”、“+10:00”或“-6:00”

  2. 作为命名时区:“欧洲/赫尔辛基”、“美国/东部”或“MET”


只有在 mysql 数据库中的时区信息表已创建并填充后,才能使用命名时区。


在文件“my.cnf”中

default_time_zOne='+00:00'

或者

timezOne='UTC'

@@global.time_zone 变量

查看它们设置为什么值

SELECT @@global.time_zone;

要为其设置值,请使用以下任一:

SET GLOBAL time_zOne= '+8:00';
SET GLOBAL time_zOne= 'Europe/Helsinki';
SET @@global.time_zOne='+00:00';

@@session.time_zone 变量

SELECT @@session.time_zone;

要设置它,请使用以下任一:

SET time_zOne= 'Europe/Helsinki';
SET time_zOne= "+00:00";
SET @@session.time_zOne= "+00:00";

“@@global.time_zone 变量”和“@@session.time_zone
变量”都可能返回“SYSTEM”,这意味着它们使用“my.cnf”中设置的时区。

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support。
html

注意:你不能这样做,因为它会返回 NULL:

SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`

设置mysql时区表

为了CONVERT_TZ工作,您需要填充时区表

SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;

如果它们是空的,则通过运行此命令来填充它们

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

如果此命令给出错误“ data too long for column ‘abbreviation’ at row
1 ”,则可能是由于在时区缩写末尾附加了 NULL 字符

修复是运行这个

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql

(确保您的服务器 dst 规则是最新的zdump -v Europe/Moscow | grep 2011https://chrisjean.com/updating-daylight-saving-time-on-
linux/)

查看每个时区的完整 DST(夏令时)转换历史

SELECT
tzn.Name AS tz_name,
tztt.Abbreviation AS tz_abbr,
tztt.Is_DST AS is_dst,
tztt.`Offset` AS `offset`,
DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND) AS transition_date
FROM mysql.`time_zone_transition` tzt
INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id)
INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id)
-- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes
ORDER BY tzt.Transition_time ASC

CONVERT_TZ还根据上表中的规则和您使用的日期应用任何必要的 DST 更改。

根据文档,您为
time_zone 设置的值不会改变,例如,如果您将其设置为“+01:00”,那么 time_zone 将设置为与 UTC 的偏移量,它不遵循
DST,所以它将全年保持不变。

只有指定的时区会在夏令时更改时间。

像这样的缩写CET将始终是冬季时间和CEST夏季时间,而 +01:00 将始终是UTC时间 + 1 小时,两者都不会随 DST 改变。

system时区将是安装 mysql 的主机的时区(除非 mysql 无法确定它)

您可以在此处阅读有关使用 DST
的更多信息

传奇人物 Jon Skeet 何时不使用
UTC:https ://codeblog.jonskeet.uk/2019/03/27/storing-utc-is-not-a-
silver-bullet/ (例如未来的预定活动代表一个时间,而不是一个瞬间)





推荐阅读
  • 在MySQL中实现时间比较功能的详细解析与应用
    在MySQL中实现时间比较功能的详细解析与应用。本文深入探讨了MySQL中时间比较的实现方法,重点介绍了`UNIX_TIMESTAMP`函数的应用。该函数可以接收一个日期时间参数,也可以不带参数使用,其返回值为Unix时间戳,便于进行时间的精确比较和计算。此外,文章还涵盖了其他相关的时间处理函数和技巧,帮助读者更好地理解和掌握MySQL中的时间操作。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文深入探讨了MySQL数据库设计的核心概念与实用技巧,重点讲解了数据库设计的三范式。第一范式要求每个表都应具备主键,并确保所有字段具有原子性,即不可再进一步分割。第二范式则在此基础上进一步规范,确保所有非主键字段完全依赖于主键,避免部分依赖带来的数据冗余问题。第三范式则进一步消除传递依赖,确保非主键字段之间不存在依赖关系,从而提高数据的一致性和完整性。通过这些范式的应用,可以有效提升数据库的设计质量和性能。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 在将Web服务器和MySQL服务器分离的情况下,是否需要在Web服务器上安装MySQL?如果安装了MySQL,如何解决PHP连接MySQL服务器时出现的连接失败问题? ... [详细]
  • 本文详细介绍了MySQL数据库服务器(mysqld)和客户端(mysql)的区别,并提供了多种启动和关闭MySQL服务器的方法。通过这些方法,您可以更好地管理和维护MySQL数据库。 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 本文提供了在Windows系统上部署和启动MySQL免安装版本的详细步骤。首先,从MySQL官方网站下载社区版免安装包(https://dev.mysql.com/downloads/mysql/8.0.html),将其解压至指定目录,例如D:\tools\mysql。接着,配置系统环境变量,确保MySQL命令行工具可以在任意路径下使用。此外,还需创建并配置my.ini文件以设置MySQL的基本参数,确保数据库服务能够顺利启动和运行。 ... [详细]
author-avatar
80后之多管闲事
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有