news 2026/4/18 9:40:45

MySQL 时区参数 time_zone 详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 已经离现在不远了,是需要重视的,业务又将面临一次类似千年虫的问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:53:14

基于python深度学习的面部表情识别系统

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

作者头像 李华
网站建设 2026/4/18 8:55:28

【ITK手册006】itk::Point 深度解析与实用指南

【ITK手册006】itk::Point 深度解析与实用指南 0. 概述 在 ITK (Insight Segmentation and Registration Toolkit) 的几何框架中,itk::Point 是最基础的类之一。它用于表示 n 维欧几里得空间中的一个静态位置(坐标)。 与 itk::Vector&#xf…

作者头像 李华
网站建设 2026/4/18 5:41:48

论文写作隐藏技巧:7款AI神器5分钟生成3万字+真实参考文献揭秘

开头:90%的学生不知道的论文“黑科技”,导师私藏的学术加速密码 你是否经历过: 对着空白文档熬到凌晨3点,初稿还停留在“研究背景”?导师的修改意见像“天书”,改了3遍还是被打回?查重报告飘红…

作者头像 李华
网站建设 2026/4/17 12:06:44

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

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

作者头像 李华
网站建设 2026/4/18 8:55:06

10347_基于Springboot的新疆旅游管理系统

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料;带你从零开始部署运行本套系统。2、项目介绍随着社会经济水平不断地提高,人们的生活条件也越来越好,除了注重日常的吃穿用度之外,越来越多的人开始去到别的城市旅游&a…

作者头像 李华
网站建设 2026/4/18 8:55:40

CES观察丨从个人AI到物理AI,高通的AI战略跃迁

文|刘俊宏编|王一粟每年CES最大的看点,还得是消费电子领域中各种各样的“怪东西”。2026年的CES,也充满了各种奇思妙想的AI硬件。能记忆并提供情绪价值的AI相机、监控用户情绪的AI吊坠、能根据用户情绪显示画面的AI相框、AI指导用…

作者头像 李华