MySQL 解决时区相关问题
在使用 MySQL 的过程中,你可能会遇到时区相关问题,比如说时间显示错误、时区不是东八
区、程序取得的时间和数据库存储的时间不一致等等问题。其实,这些问题都与数据库时区设
置有关。
MySQL Server 中有 2 个环境变量和时区有关,你通过下述 SQL 语句能查看得到它俩的值:
mysql> show global variables like '%time_zone%';
不出意外的话,你看到的大概是类似如下内容:
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
还有一种小概率的可能,你的 system_time_zone 的值是空的。
system_time_zone 环境变量
它的值是 MySQL server 启动时,它自己去查询到的其所在服务器的系统时区。这个值是我们
无法影响、改变的,除非你去动你的操作系统时区设置。
如果你的 Linux 操作系统开启了 NTP 服务的话,这个时区应该是你的电脑硬件所位于的真实
的、物理时区。
通常情况下,我们看到的这个环境变量的值是 CST :中国标准时间 ( 即,UTC+08:00 ) 。 这个值也有可能为空,那就是你系统时区设置有问题。
但是 CST 有个问题:还有另外的三个时区 ( 美国中部时间、澳大利亚中部时间、古巴标准时 ) 缩写也叫 CST ,这就导致了你如果使用 CST 来代表你的时区的话,那么它有可能会引起歧义。简
单来说,你从『中国标准时间』这个说法可以“得到” CST ,但是你从 CST 不一定能反推出
『中国标准时间』这个说法。
system_time_zone 环境变量的值和我们未来使用 MySQL 并没有直接的关系,但是有间接关
系:它的值是 time_zone 环境变量的默认值 。
对于你的 Linux 操作系统的时区,你可以通过如下命令查看得到:
# 时区显示的是 CST
date
# 时区显示的是 +0800
date -R
time_zone 环境变量
MySQL Server 通过这个环境变量实现了这样的一个功能:你可以无视 MySQL Server 实际所
在的时区,而强行认为、假想 MySQL Server 是在某个时区。此时,你的有关日期时间的操
作,都是基于这个你指定、假象的逻辑上的时区得到的数据。
在连上 MySQL Server 之后,执行如下命令,『强行认为』MySQL Server 位于东九区 ( 日本
所在时区 ) :
mysql> set time_zone = '+9:00';
这个操作意味着:在此次连接/会话过程中,你认为 MySQL Server 是位于东九区的服务器上
的 ( 而无视它真实所在地 ) 。
提示:
当然,你也不必对 time_zone 畏之如虎,它并非对所有的日期时间操作都有影响。就我
们的日常操作而言,受它影响的主要是 now() / curtime() 函数和 TIMESTAMP 类型字
段。
now() 函数
在设置当前连接/会话的 time_zone ,即,指定你心里认为的 MySQL Server 所处于的时区之
后,执行如下命令向 MySQL Server “询问”当前时间:
mysql> select now(), curtime();
你会发现 MySQL Server “回复” 你的日期时间好像要比当下要快一个小时,这正是此时此刻
东九区 ( 日本 ) 的时间。
补充:
有三个 utc_X() 函数,它们永远返回的是当下的 UTC 时间,即格林威治时间 ( +0:00
) :mysql> select utc_date(), utc_time(), utc_timestamp();
timestamp 类型
timestamp 类型的数据也会受到 time_zone 的影响。
当你通过 insert sql 语句,要求 MySQL Server 在 timestamp 类型的字段中存储 12:00
时,MySQL Server 考虑到自己现在是在一台东九区的服务器上,所以它存储的时间本质上就
是 UTC 标准时 3:00 。
未来,你再通过 select sql 语句,从 MySQL Server 中查询这个 timestamp 类型的值时,
MySQL Server 如果发现自己是在一台东八区的服务器上,那么它返回给你的就是东八区
11:00 。
你会发现:你存进去的是 12:00 ,但是取出来的是 11:00 。
timestamp 类型的数据也会受到 time_zone 的影响,这也是不建议使用 timestamp 的原因之
一。
提示:
date、time 和 datetime 类型不似 timestamp,它们不受 time_zeon 所设置的时区影
响。它们的值是多少就是多少,不会出现 timestamp 这种存进去是这个值,取出来是那
个值的情况。
默认值 SYSTEM
大家也看到了,time_zone 环境变量的默认值是 SYSTEM ,它的含义是『 time_zone 的值与
system_time_zone 环境变量的值保持一致』。在之前的例子中,这个值就是 CST ,即,东八
区。
为了减少 MySQL Server 对于服务器环境的依赖,以及前面提到的 CST 会引起歧义的问题,
通常我们最好还是自己指定 time_zone 的值,将它固定成事实上的、MySQL Server 其所在的
时区。
之前也见过,使用如下设置可以临时改变 time_zone 的值
-- 对当前连接生效
mysql> set time_zone = '+8:00';
-- 对此后的所有新连接/会话生效,但是 MySQL Server 重启后失效。
mysql> set global time_zone = '+8:00';
想要一劳永逸地修改它,你需要改动 mysql 配置文件,在配置文件 [mysqld] 部分增加一行:
default_time_zone = '+8:00'
另外,当 time_zone=system 的时候,调用 now(),或查询 timestamp 字段会调用系统的时
区做时区转换,有全局锁 __libc_lock_lock 的保护,可能导致线程并发环境下系统性能受
限。而改为'+8:00'则不会触发系统时区转换,使用 MySQL 自身转换,大大提高了性能。这也
是为什么建议改以下 time_zone ,不要让它是 SYSTEM 的原因之一。
JDBC 中的 serverTimezone
JDBC 在 MySQL 8.0 本之后要求连接的 URL 中要求必须带上 serverTimezone 属性,而之前
这个属性是非必须的。
在之前的版本中,当我们的 URL 中没有带上 serverTimezone 时,我们的程序与 MySQL
Server 之间的连接/会话的 time_zone 就是 MySQL Server 中的配置 ( 的默认值 ) 所决定的。
现在我们的 URL 中带上 serverTimezone 之后,就由我们 URL 中的这个值决定了。
不过,理论上,这个值也就应该等于我们的程序要连上的 MySQL Server 那台服务器所在的真
实、物理时区。
相差 13 小时或 14 小时
如果说相差 8 小时不够让人惊讶,那相差 13 小时可能会让很多人摸不着头脑。出现这个问
题的原因是 JDBC 与 MySQL 对「CST」时区协商不一致。因为 CST 时区是一个很混乱的时
区,有四种含义:
美国中部时间 Central Standard Time (USA) UTC-05:00 或 UTC-06:00
澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
中国标准时 China Standard Time UTC+08:00
古巴标准时 Cuba Standard Time UTC-04:00
MySQL 中,如果 time_zone 为默认的 SYSTEM 值,则时区会继承为系统时区 CST ,MySQL 内
部将其认为是 UTC+08:00 。而 jdbc 会将 CST 认为是美国中部时间,这就导致会相差 13 小
时,如果处在冬令时还会相差 14 个小时。
解决此问题的方法也很简单,我们可以明确指定 MySQL 数据库的时区,不使用引发误解的
CST ,可以将 time_zone 改为'+8:00',同时 jdbc 连接串中也可以增加
serverTimezone=Asia/Shanghai。
总结
为了保证不出现存取的日期时间有偏差的情况,大家务必确保如下几点:
1. MySQL Server 所在的服务器的系统时区尽量是正确的、真实的、物理时区;
default_time_zone = '+8:00'
2. 无论服务器的系统时区是否是对的,MySQL Server 的 time_zone 的值要通过修改配置文件
的方式,一劳永逸地确定下来,保证是正确的、真实的、物理时区;
3. JDBC 的 URL 中现在规定必须要带上 serverTimezone 参数,这个参数的值必须是 MySQL
Server 的所在的真实时区,即与 2 中的 time_zone 一致。
相关文章:
MySQL 解决时区相关问题
在使用 MySQL 的过程中,你可能会遇到时区相关问题,比如说时间显示错误、时区不是东八 区、程序取得的时间和数据库存储的时间不一致等等问题。其实,这些问题都与数据库时区设 置有关。 MySQL Server 中有 2 个环境变量和时区有关,…...
SpringSecurity Context 中 获取 和 更改 当前用户信息的问题
SpringSecurity Context 获取和更改用户信息的问题 SecurityContext 异步线程中获取用户信息 今天在做项目时遇到了一个问题,我需要获取当前用户的 ID。之前,前端并没有存储用户信息,我一直是在后端的 service 中通过 SecurityContext 来获…...
Makefile的四种赋值运算符
Makefile有四种赋值运算符:简单赋值(:)、递归赋值()、条件赋值(?)和追加赋值() 1. 简单赋值(:) 作用:覆盖之前的值。若在多次简单赋…...
framebuffer
framebuffer:帧缓冲、帧缓存 Linux内核为显示提供的一套应用程序接口(驱动内核支持) 分辨率:像素点的总和 像素点: 显示屏:800*600(横向有800个像素点,纵向有600个像素点&#x…...
7.科学计算模块Numpy(4)ndarray数组的常用操作(二)
引言 书接上回,numpy能作为python中最受欢迎的数据处理模块,脱离不了它最核心的部件——ndarray数组。那么,我们今天就来了解一下numpy中对ndarray的常用操作。 通过阅读本篇博客,你可以: 1.掌握ndarray数组的分割 …...
抖音评论区截流脚本软件详细使用教学,抖音私域获客引流的五种方法。
1.先说下什么是抖音截流玩法,截流顾名思义就是在别的博主的视频下面去截流评论潜在流量,然后用评论文案的形式或者其它方式吸引用户加我们的私域~ 玩截流一定不是主动去私信别人,这个就不叫截流了,且一个账号私信多了一定会降权和…...
Linux_kernel移植uboot07
一、移植 根据硬件平台的差异,将代码进行少量的修改,修改过后的代码在目标平台上运行起来 移植还需要考虑硬件环境,驱动只需要考虑内核的环境 二、移植内容 1、移植Uboot uboot属于bootloader的一种,还有其他的bootloader&#x…...
Day-04-QFile打开文件的两种方式
一、UI界面设置两个按键,并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数,应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…...
第三部分:4---进程地址空间
目录 数组的空间分配解析: 物理地址和虚拟地址: 虚拟地址空间: 进程地址空间的本质: 为什么要有进程地址空间? 页表对进程访问内存的检查: 进程地址空间和页表如何关联起来? 进程的独立…...
【Android】程序开发组件—探究Jetpack
引言 Jetpack是一个开发组件工具集,它的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发过程,在这么多的组件当中,最需要我们关注的其实还是架构组件,接下来就对Jetpack的主要架构组件进行学习!…...
pytorch torch.norm函数介绍
torch.norm 函数用于计算张量的范数(norm),可以理解为张量的“长度”或“大小”。根据范数的不同类型,它可以衡量不同的张量性质。该函数可以计算 向量 和 矩阵 的多种范数,如 L1范数、L2范数、无穷范数 等。 1. 函数…...
【lc_hot100】刷题心得
链表 二叉树 二叉树相关的题目基本都有个基本的框架,基本框架就是二叉树的四种遍历方法:前序遍历、中序遍历、后序遍历、层序遍历 往往常用的是前序遍历和中序遍历 图 图跟二叉树一样都有自己的的基本框架,基本框架就是图的两种遍历方法&am…...
FANUC 数控 A06B-6058-H227 伺服放大器
发那科伺服放大器是一种控制电机的电子装置,属于电机控制系统的一部分,用于将输入信号放大并转换成电动机可以理解的信号,从而实现运动控制和定位。 发那科伺服放大器的主要作用包括: 实现运动控制:通过控制…...
Python将表格文件中某些列的数据整体向上移动一行
本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,对其中的每一个文件加以操作——将其中指定的若干列的数据部分都向上移动一行,并将所有操作完毕的Excel表格文件中的数据加以合并,生成一个新的Excel文件的方法。 首…...
基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)
💡💡💡本文内容:针对基于YOLOv8的PCB缺陷检测算法进行性能提升,加入各个创新点做验证性试验。 1)提出了一种基于内容引导注意力(CGA)的混合融合方案,mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…...
如何在红米手机中恢复已删除的照片?(6 种方式可供选择)
凭借出色的相机和实惠的价格,小米红米系列已成为全球知名品牌。但是,最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频,并希望弄清楚如何从小米手机恢复已删除的照片。好吧,在小米设备上恢复已删除的视频/照片并不难。…...
嵌入式实时操作系统(RTOS):原理、应用与发展
摘要:本文围绕嵌入式实时操作系统(RTOS)展开。首先介绍嵌入式系统与实时操作系统的概念,阐述嵌入式 RTOS 的体系结构。接着分析其关键特性,包含任务管理(如任务的创建与删除、调度、同步与通信)…...
C#里使用位图容器BitArray
由于经常需要操作一些位表示的数据结构,那么就需要采用位图的管理方式。 在C#里就是使用BitArray来管理位图数据结构,这样就比较方便处理。 这个类可以有多种构造函数,可以满足绝大部分的要求。 比如从网络协议里传送过来的字节流,就可以直接写入到里面,就可以直接获取…...
如何在 Kali Linux 上安装 pip3
如何在 Kali Linux 上安装 pip3 在 Kali Linux 上安装 pip3 的过程非常简单。按照以下步骤,你可以轻松完成安装并开始使用 pip3 管理 Python 软件包。 步骤 1:打开终端 首先,打开你的 Kali Linux 终端。 步骤 2:更新软件包列表…...
5.2 排列与代数余子式
一、求行列式的方法 计算机是利用主元计算行列式的。本节介绍其它两种计算行列式的方法。一是 “大公式”(big formula),它使用了全部 n ! n! n! 个排列计算;二是 “代数余子式公式”(cofactor formula)&…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
