MySQL:一文弄懂时区time_zone
你还在被以下问题困扰吗:
MySQL 的安装规范中应该设置什么时区?
JAVA 应用读取到的时间和北京时间差了 14 个小时,为什么?怎么解决?
已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据吗?
迁移数据时会有导致时间类型数据时区错误的可能吗?
…
看完这篇文章,你能解决上面所有的疑惑。
启动参数&系统变量
如果要在 MySQL 启动时就指定时区,则应该使用启动参数:default-time-zone,示例:
##方法 1:在启动命令中添加
mysqld --default-time-zone='+08:00' &##方法 2:在配置文件中添加
[mysqld]
default-time-zone='+08:00'
启动后我们可以看到控制时区的系统变量,其中 time_zone 变量控制时区,在 MySQL 运行时可以通过 set命令修改(注意:不可以写在 my.cnf 中):
#查看
mysql> show global variables like '%time%zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)#修改全局时区,所有新创建的 session 都会被修改
set global time_zone='+00:00';#修改当前 session 的时区
set session time_zone='+00:00';
启动参数和系统变量的可用值遵循相同的格式:
- SYSTEM 表明使用系统时间
- 相对于 UTC 时间的偏移,比如 +08:00 或者 -6:00
- 某个时区的名字,比如 ‘Europe/Helsinki’,‘‘Asia/Shanghai’’ 或 ‘UTC’,前提是已经把时区信息导入到了 mysql 库,否则会报错。导入方法:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -S /tmp/mysqld.sock mys
system_time_zone
变量只有全局值没有会话值,不能动态修改,MySQL 启动时,将尝试自动确定服务器的时区,并使用它来设置 system_time_zone 系统变量, 此后该值不变。当 time_zone='system'
时,就是使用的这个时区,示例中 time_zone 就是
mysql> show global variables like '%time%zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)#可以看到在当前操作系统上 CST 就是 +08:00 时区
[root@localhost ~]# date -R
Mon, 30 Dec 2024 14:44:48 +0800
[root@localhost ~]# date
2024年 12月 30日 星期一 14:44:56 CST
时区影响了什么
概括一下就两点:
1. NOW()
和 CURTIME()
系统函数的返回值受当前 session 的时区影响
不仅是 select now()
,包括 insert .. values(now())
、以及字段的 DEFAULT CURRENT_TIMESTAMP
属性也受此影响:
mysql> set time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)mysql> select now(),CURTIME();
+---------------------+-----------+
| now() | CURTIME() |
+---------------------+-----------+
| 2024-12-30 06:53:42 | 06:53:42 |
+---------------------+-----------+
1 row in set (0.00 sec)mysql> set time_zone='+08:00';
Query OK, 0 rows affected (0.00 sec)mysql> select now(),CURTIME();
+---------------------+-----------+
| now() | CURTIME() |
+---------------------+-----------+
| 2024-12-30 14:53:59 | 14:53:59 |
+---------------------+-----------+
1 row in set (0.00 sec)
2. timestamp 数据类型字段存储的数据受时区影响
timestamp 数据类型会存储当时 session 的时区信息,读取时会根据当前 session 的时区进行转换;而datetime 数据类型插入的是什么值,再读取就是什么值,不受时区影响。也可以理解为已经存储的数据是不会变的,只是 timestamp 类型数据在读取时会根据时区转换
mysql> set time_zone='+08:00';
Query OK, 0 rows affected (0.00 sec)mysql> create table c(ts timestamp, dt datetime);
Query OK, 0 rows affected (0.02 sec)mysql> insert into c values('2024-12-30 14:59:39','2024-12-30 14:58:39');
Query OK, 1 row affected (0.00 sec)mysql> select * from c;
+---------------------+---------------------+
| ts | dt |
+---------------------+---------------------+
| 2024-12-30 14:59:39 | 2024-12-30 14:58:39 |
+---------------------+---------------------+
1 row in set (0.00 sec)mysql> set time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)mysql> select * from c;
+---------------------+---------------------+
| ts | dt |
+---------------------+---------------------+
| 2024-12-30 06:59:39 | 2024-12-30 14:58:39 |
+---------------------+---------------------+
1 row in set (0.00 sec)
结论
关于时区所有明面上的东西都在上面了,下面来是几个常见的问题。
1. MySQL 的安装规范中应该设置什么时区?
对于国内的业务了,在 my.cnf 写入 default-time-zone=‘+08:00’ ,其他地区和开发确认取对应时区即可。
为什么不设置为 system 呢?使用系统时间看起来也是个不错的选择,比较省事。不建议的原因有两点:
- 操作系统的设置可能不归 DBA 管,万一别人没有设置正确的系统时区呢?只做自己有把握的事更稳妥
- 多了一层系统调用,性能有损耗。
2. JAVA 应用读取到的时间和北京时间差了 14 个小时,为什么?怎么解决?
这通常是 JDBC 参数中没有为连接设置时区属性(用 serverTimezone 参数指定),并且 MySQL 中没有设置全局时区,这样 MySQL 默认使用的是系统时区,即 CST。这样一来应用与 MySQL 建立的连接的session time_zone 为 CST
,前面我们提到 CST 在 RedHat 上是 +08:00 时区,但其实它一共能代表 4 个时区:
- Central Standard Time (USA) UT-6:00 美国标准时间
- Central Standard Time (Australia) UT+9:30 澳大利亚标准时间
- China Standard Time UT+8:00 中国标准时间
- Cuba Standard Time UT-4:00 古巴标准时间
JDBC 在解析 CST 时使用了美国标准时间,这就会导致时区错误。要解决也简单:一是遵守上面刚说到的规范,对 MySQL 显示地设置’+08:00’时区;二是 JDBC 设置正确的 serverTimezone 。
3. 已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据吗?
完全不会,只会影响对 timestamp 数据类型的读取。这里不得不提一句,为啥要用 timestamp?用
datetime 不香吗,范围更大,存储空间其实差别很小,赶紧加到开发规范中吧。
4. 迁移数据时会有导致时间类型数据时区错误的可能吗?
这个还真有,还是针对 timestamp 数据类型,比如使用 mysqldump 导出 csv 格式的数据,默认这种导出方式会使用 UTC 时区读取 timestamp 类型数据,这意味导入时必须手工设置
session.time_zone='+00:00’才能保证时间准确:
# test.t 导出成 csv
mysqldump -S /data/mysql/data/3306/mysqld.sock --single-transaction \
--master-data=2 -t -T /data/backup/test3 --fields-terminated-by=',' test t#查看导出数据
cat /data/backup/test3/t.txt
2024-12-30 06:59:39 , 2024-12-30 14:58:39
如何避免?mysqldump 也提供了一个参数 --skip-tz-utc
,意思就是导出数据的那个连接不设置 UTC 时区,使用 MySQL 的 global time_zone
系统变量值
其实 mysqldump 导出 sql 文件时默认也是使用 UTC 时区,并且会在导出的 sql 文件头部带有 session time_zone
信息,这样可以保证导 SQL 文件导入和导出时使用相同的时区,从而保证数据的时区正确
(而导出的 csv 文件显然不可以携带此信息)。需要注意的是 --compact 参数会去掉 sql 文件的所有头信息,所以一定要记得:--compact 参数得和 --skip-tz-utc 一起使用
以上就是全部内容了,如果对大家有帮助请点个赞,创作不易,谢谢!
相关文章:
MySQL:一文弄懂时区time_zone
你还在被以下问题困扰吗: MySQL 的安装规范中应该设置什么时区? JAVA 应用读取到的时间和北京时间差了 14 个小时,为什么?怎么解决? 已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据…...

基于python的天气可视化系统
目 录 1绪论 1.1研究背景 1.2研究意义 1.3当前研究现状 1.4研究内容 第2章 相关基础理论 2.1 爬虫技术基础 2.2 Python 在爬虫中的应用 2.3 爬虫系统的设计要点 第3章 天气网数据可视化系统设计 3.1 系统概述及主要内容 3.1.1 系统架构 3.1.2 工具选择…...

STM32 高级 WIFi案例1:测试AT指令
需求描述 测试AT指令是否能够正常控制ESP32的wifi,比如重启、读取设备信息等。 思路: stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置: 第一步:对ESP32芯片烧录可以读取stm32命令的固件(fac…...

SpringCloud微服务架构
文章目录 认识微服务:SpringCloud 服务拆分及远程调用实现夸远程服务调用使用RestTemplateEureka注册中心 搭建EruekaServer注册服务服务发现 Ribbon负载均衡 修改负载均衡规则解饿加载 Nacos注册中心(nacos一部分功能) 服务注册到nacosnacos…...
WebSocket封装
提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...
基于Flask后端框架的均值填充
Flask可以在Jupyter上运行,首先需要安装这两个库: !pip install Flask-CORS !pip install Flask 引入依赖: from flask import Flask, request, jsonify, send_file import os import pandas as pd import io from flask import Flask fr…...

SQL-Server链接服务器访问Oracle数据
SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …...
Python中continue语句的使用
1 问题 本文将对在循环中continue语句的用途和如何正确使用continue进行分析与总结。 2 方法 (1)定义: 在编程中,“continue”是一个关键字,用于循环结构中。它的作用是跳过当前循环的剩余部分,立即进入下一…...
JavaScript的diff库详解(示例:vue项目实现两段字符串比对标黄功能)
diff库介绍 diff 库是基于 Myers 差分算法 实现的 JavaScript 文本差异库。 Myers 差分算法 是由 Eugene Myers 在 1986 年发表的一篇经典算法论文 “An O(ND) Difference Algorithm and its Variations” 中描述的一种高效算法,用于计算两个序列(通常是…...

自动驾驶3D目标检测综述(六)
停更了好久终于回来了(其实是因为博主去备考期末了hh) 这一篇接着(五)的第七章开始讲述第八章的内容。第八章主要介绍的是三维目标检测的高效标签。 目录 第八章 三维目标检测高效标签 一、域适应 (一)…...

the request was rejected because no multipart boundary was found
文章目录 1. 需求描述2. 报错信息3. 探索过程 1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票,经过后端解析PDF之后,将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.u…...
HarmonyOS-面试整理
目录 为什么选择HarmonyOS/ 优点/特点鸿蒙系统的权限有哪些说一说鸿蒙系统的安全机制说一说鸿蒙系统的微内核与安卓的内核区别鸿蒙操作系统的微内核架构有哪些优势分布式能力在鸿蒙系统中如何实现请解释一下鸿蒙系统中的分布式软总线技术如何在鸿蒙操作系统中进行多设备协同开发…...
[C#] 「Unity」「游戏开发」如何在Canvas下的Button控件下实例化Image元素
在开发过程中,经常需要在UI上动态添加元素。特别是在Unity中,Canvas控件通常用来作为UI元素的容器,而Button控件则常用于交互。而在某些情况下,我们可能需要在一个Button下实例化一个Image元素,并确保它的位置与Button的位置保持一致。然而,简单地使用Button的坐标值往往…...

Nginx1.20.2-Linux-安装
文章目录 1.下载压缩包1.官网下载2.找到1.20.23.百度网盘 2.Linux安装1.搭建gcc环境2.上传到 /usr/local/nginx1.20.23.解压1.解压到当前目录2.删除压缩包 4.配置Nginx的编译路径1.进入nginx-1.20.22.执行内部的脚本,指定编译路径为/usr/local/nginx 5.编译并安装6.…...
Elasticsearch名词解释
文章目录 1.什么是Elasticsearch?2.什么是elastic stack(ELK)?3.什么是Lucene?4.什么是文档(document)?5.什么是词条(term)?6.什么是正向索引?7.什么是倒排索引?8.ES中的索引(index)9.映射(Mapping)10.DSL11.elastcisearch与my…...

Node项目——从0开始构建且共享至Gitee
从0开始构建一个Node.js项目涉及多个步骤,包括设置开发环境、初始化项目、安装依赖、编写代码以及配置版本控制等。以下是一个详细的步骤指南: 1. 安装Node.js和npm 首先,确保你已经安装了Node.js和npm(Node Package Manager&am…...
layui多图上传,tp8后端接收处理
环境:layui2.9.21\thinkphp8.1 前端代码: layui.use([upload, layer], function() {const upload layui.upload;const layer layui.layer;const $ layui.$;// 上传图片const uploadInstImage upload.render({elem: #uploadImage,url: /admin/demo/…...

QEMU网络配置简介
本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…...
28.Marshal.PtrToStringAnsi C#例子
//怎么说呢,这个代码Marshal的英文意思有将军,控制等等, //我的理解是类似于console控制台。 //然后后面这个Ansi是一种ASCII的扩展,还有其他编码方式可选 就是一个把后面的指针转化为字符串的一个代码 这是用法…...

基于feapder爬虫与flask前后端框架的天气数据可视化大屏
# 最近又到期末了,有需要的同学可以借鉴。 一、feapder爬虫 feapder是国产开发的新型爬虫框架,具有轻量且数据库操作方便、异常提醒等优秀特性。本次设计看来利用feapder进行爬虫操作,可以加快爬虫的速率,并且简化数据入库等操作…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...