MySQL 时区参数 time_zone 详解

文章目录
  • 前言
  • 1. 时区参数影响
  • 2. 如何设置
  • 3. 字段类型选择

前言

MySQL 时区参数 time_zone 有什么用?修改它有什么影响?如何设置该参数,本篇文章会详细介绍。

1. 时区参数影响

time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CURRENT_TIMESTAMP 的属性。

查询当前的时区,+8:00 就代表国内的时区:

root@mysql 15:08: [(none)]>select @@time_zone; +-------------+ | @@time_zone | +-------------+ | +08:00 | +-------------+

查询当前时间:

root@mysql 15:09: [(none)]>select now(); +---------------------+ | now() | +---------------------+ | 2024-12-12 15:09:44 | +---------------------+

修改时区,为 UTC -8:00 美国时间:

root@mysql 15:09: [(none)]>set global time_zone = '-08:00'; Query OK, 0 rows affected (0.00 sec)

查询当前时间:

root@mysql 15:09: [(none)]>select now(); +---------------------+ | now() | +---------------------+ | 2024-12-11 23:09:55 | +---------------------+

另外,需要注意的是 timestamp 类型,会随着 time_zone 的值产生变化,而 datetime 类型则不会,请看下方演示。

确认当前 time_zone 参数值:

select @@time_zone; +-------------+ | @@time_zone | +-------------+ | +08:00 | +-------------+

创建测试表结构,两张表的区别是 created_at、updated_at 分别为 datetime 和 timestamp 类型。

CREATE TABLE `api_datetime` ( `id` bigint(64) NOT NULL AUTO_INCREMENT, user varchar(10), `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `enabled` bit(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; CREATE TABLE `api_timestamp` ( `id` bigint(64) NOT NULL AUTO_INCREMENT, user varchar(10), `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `enabled` bit(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

模拟数据插入:

insert into api_timestamp(user, enabled) values ('+08:00', b'1'); insert into api_datetime(user, enabled) values ('+08:00', b'1');

查询表数据:

root@mysql 16:21: [test]>select user,created_at, updated_at from api_datetime; +--------+---------------------+---------------------+ | user | created_at | updated_at | +--------+---------------------+---------------------+ | +08:00 | 2024-12-12 16:20:34 | 2024-12-12 16:20:34 | +--------+---------------------+---------------------+ 1 row in set (0.00 sec) root@mysql 16:21: [test]>select user,created_at, updated_at from api_timestamp; +--------+---------------------+---------------------+ | user | created_at | updated_at | +--------+---------------------+---------------------+ | +08:00 | 2024-12-12 16:20:33 | 2024-12-12 16:20:33 | +--------+---------------------+---------------------+

修改 time_zone 参数值,为 -8:00:

set global time_zone = '-8:00';

插入测试数据:

insert into api_timestamp(user, enabled) values ('-08:00', b'1'); insert into api_datetime(user, enabled) values ('-08:00', b'1'); root@mysql 16:25: [test]>select user,created_at, updated_at from api_datetime; +--------+---------------------+---------------------+ | user | created_at | updated_at | +--------+---------------------+---------------------+ | +08:00 | 2024-12-12 16:20:34 | 2024-12-12 16:20:34 | | -08:00 | 2024-12-12 00:25:52 | 2024-12-12 00:25:52 | +--------+---------------------+---------------------+ 2 rows in set (0.00 sec) root@mysql 16:25: [test]>select user,created_at, updated_at from api_timestamp; +--------+---------------------+---------------------+ | user | created_at | updated_at | +--------+---------------------+---------------------+ | +08:00 | 2024-12-12 00:20:33 | 2024-12-12 00:20:33 | | -08:00 | 2024-12-12 00:25:52 | 2024-12-12 00:25:52 | +--------+---------------------+---------------------+ 2 rows in set (0.00 sec)

由上方测试,我们发现如果字段设置为 CURRENT_TIMESTAMP 无论是 datetime 还是 timestamp 类型,都会随 time_zone 参数影响,不过 datetime 类型的历史数据不会受影响,timestamp 类型的历史数据,会随着 time_zone 的调整而发生变化。

2. 如何设置

推荐直接写在 MySQL 的配置文件中,需要重启生效。

[mysqld] default-time-zone='+08:00'

该参数默认为 SYSTEM 表示该参数值,取自操作系统的时区设置。不过还是建议在 MySQL 参数文件中设置一下,因为操作系统可能可能不完全归 DBA 管理,万一有人突然调整了,可能会引起线上问题。

另外,如果 time_zone 使用默认的 system 值,表示默认使用操作系统的时区,则每次通过时区计算时间时,要调用操作系统底层系统函数 __tz_convert(),而这个函数需要额外的加锁操作,以确保这时操作系统时区没有修改。高并发的时候会导致 TIMESTAMP 类型的表和操作,性能降低。

3. 字段类型选择

业务中尽量使用 datetime 类型来存储时间,除了历史数据不会随着时区发生变化外,还有一个最大值限制问题。

TIMESTAMP 存储的是 1970-01-01 00:00:00’ 到现在的毫秒数,TIMESTAMP 占用 4 个字节,因此其存储的时间上限只能到 2038-01-19 03:14:07 已经离现在不远了,是需要重视的,业务又将面临一次类似千年虫的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码

量化交易的核心在于将交易规则和策略转化为计算机可执行的代码。其中,技术指标的计算和基于这些指标生成交易信号是策略实现的基础环节。本文将深入探讨如何从零开始开发量化交易脚本,重点聚焦于常见技术指标的计算逻辑以及如何基于这些指标设计并实现信…

MySQL 数据增删改查

一、插入数据 1.1 insert插入数据 (1)insert语法格式 INSERT [INTO] 表名 [字段名] VALUES (值列表);(2)示例 ① 向学生表中插入一行数据② 向学生表中插入多行数据二、更新数据 2.1 update更新数据 (1)…

RAG Agent记忆功能完全指南:3种方法解决长对话上下文丢失问题

本文介绍了为RAG Agent添加记忆功能的实现方法,重点讲解了如何通过消息列表实现短期记忆,以及解决长对话导致的上下文窗口限制问题,包括截断、删除和总结消息三种方法,并介绍了如何自定义AgentState来增强记忆能力,帮助…

Ehercat代码解析中文摘录<8>

12 工具从站协议栈代码工具允许根据用户特定要求和设置创建新的从站文件。从站文件列表:C源代码文件源代码文档(可选)设备描述(ESI)(可选)支持的操作系统:Windows XP, Vista, 7 (32位…

太流批了,老牌软件,数据对比神器

在日常工作中打工人有的时候需要整理表格和数据,需要在两个文档之间进行对比,看一看文件做了哪些修改。但是,如果用眼进行一行行对比的话就会很麻烦,而且效率会很慢。今天给大家推荐一款好用的数据对比软件,有需要的小…

收藏!裸辞转型AI大模型,我的完整攻略与经验分享

本文分享裸辞转型AI大模型的成功经历,包括转行动机、系统学习准备和面试经验。强调深入理解底层原理、做好经济心态准备、针对性优化简历和保持良好心态的重要性,为想进入AI领域的人提供实用参考。今年很重要的一个经历就是裸辞然后顺利转行到了AI大模型…

个性化旅游行程规划系统-计算机毕业设计源码+LW文档

摘要 随着人们生活水平的提高和旅游需求的日益增长,旅游已成为人们放松身心、拓展视野的重要方式。然而,在旅游过程中,行程规划、费用管理、信息分享等方面的问题也逐渐凸显。传统的旅游管理方式存在效率低下、信息不及时等问题,难…

北大团队创新方案:CKDA框架解决跨模态行人重识别的持续学习痛点

北大团队提出CKDA框架,解决跨模态行人重识别中的持续学习灾难性遗忘问题。该框架通过跨模态通用提示生成器提取共享特征,单模态专用提示生成器保留模态特有信息,以及跨模态知识对齐引擎防止遗忘。实验表明,该框架在四个主流数据集…

2026年--Lc333-328. 奇偶链表(链表)--java版

1.题目2.思路 原地重排链表: odd.nexteven.next:跳过偶数,把下一个奇数连起来 even.nextodd.next:跳过奇数,把下一个偶数连起来 最后把奇数链尾接回 evenHead 3.代码实现 /*** Definition for singly-linked list.* pu…

AI会取代前端吗?2026年前端发展路线图,建议收藏学习

AI无法完全取代前端开发,因缺乏人类的逻辑、沟通和创新能力。前端工作不仅是写代码,还包括与多团队协作。当前前端行业竞争激烈,要求不断提高,但仍有发展空间。前端工程师可考虑向管理、架构师或讲师方向发展,或继续深…

牛批了,桌牌台签神器,批量制作

在日常开会的时候,往往需要制作桌牌台签,排版和格式校对等问题也是非常头疼的。今天给大家推荐一款桌牌台签打印神器,能够快速高效的制作各种类型的桌牌,非常方便,有需要的小伙伴可以下载收藏。 桌牌台签打印 一键制作…

MySQL 数据库连接数查询、配置

MySQL 数据库的连接数是指同时与 MySQL 数据库建立的客户端连接数量。连接数与 MySQL 的性能密切相关,需要根据实际需求和服务器资源进行合理配置和优化。 1. 查看连接数1.1. 查看当前会话连接数 SHOW STATUS LIKE ‘Threads_connected’; 1.2. 查看历史最大连接数 …

MySQL5.7.44-winx64版本Windows Server下载安装教程图解

1、下载MySQL5.7.44安装包,MySQL :: Download MySQL Community Server (Archived Versions) 2、解压到D:mysql-5.7.44-winx64 目录下(这个可以根据需要自行调整),解压后在根目录下创建my.ini和data文件夹。 [mysql] # 设置 my…

AI Agent记忆系统大揭秘:从“失忆“到“长记性“的进化之路(附代码实战)

本文详解AI Agent的记忆系统,分短期记忆与长期记忆两部分。短期记忆介绍3种优化策略(缩减法、卸载法、隔离法)及框架代码实现;长期记忆解析信息提取、向量存储、关系推理等技术,并提供Mem0/ReMe集成代码。展望记忆即服务、精细化管理、多模态…

MySQL 数据库基础

目录 什么是数据库 数据库分类 关系型数据库 非关系型数据库 SQL子语言 MySQL MySQL 存储数据的组织方式 数据库操作 显示当前数据库 创建数据库 使用数据库 删除数据库 什么是数据库 数据库 是一个用于存储、管理和检索数据的系统,可以组织和保存大量…

基于python大数据的协同过滤音乐推荐系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

K8S网络和基本命令 【 K8S (二)】

目录 一、Flannel 的核心基础(通信前的准备) 二、Flannel 的三种核心通信模式 场景 1:同节点内 Pod 通信(无需 Flannel 隧道) 场景 2:跨节点 Pod 通信(Flannel 核心) 模式 1&…

MySQL 的 INSERT(插入数据)详解

MySQL 的 INSERT(插入数据)详解 在 MySQL 中,INSERT 语句用于向数据库表中添加新的记录。INSERT 语句非常灵活,支持多种语法形式,可以根据具体需求选择合适的用法。以下是 INSERT 语句的详细语法和使用示例。 1. 插入单…

MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互

在现代应用中,数据库是不可或缺的一部分。Java 作为一种广泛使用的编程语言,提供了丰富的 API 来与各种数据库进行交互。本文将详细介绍如何在 Java 中连接 MySQL 数据库,并实现基本的数据交互功能。 一、环境准备 1.1 安装 MySQL 首先&am…

基于BS架构的积分制零食自选平台-计算机毕业设计源码+LW文档

摘要 本文介绍了一个基于BS(Browser/Server,浏览器/服务器)架构的积分制零食自选平台的设计与实现。该平台旨在为用户提供一个便捷、个性化的零食购物体验,并通过积分制度激励用户的消费行为。平台的前端采用HTML、CSS和JavaScrip…