关于mysql的时区(下):如何设置mysql的时区
一、如何设置 mysql 时区
1、命令
1)查时区:show variables like '%time_zone%'
返回有2行记录,要看time_zone变量的值,不需要看system_time_zone。
若值为SYSTEM表示取值跟system_time_zone保持一致。
system_time_zone的值是启动mysql服务的时候读取了操作系统的值,除非重新启动mysql服务重读否则这个值不变
还有一种查时区的方法,
select @@GLOBAL.time_zone,@@SESSION.time_zone
可以查出全局的时区以及会话时区。
2)设置会话时区:set time_zone='+8:00'
仅对当前会话有效,在当前窗口立即生效,关闭会话窗口后设置失效。无需重新登录会话生效,也无需关闭窗口再开窗口
执行后如果不确定是否设置成功,可以用上面提到过的语句查查看
允许取值:
'+08:00'
,兼容了多0As a string indicating an offset from UTC of the form
[*
H*]*
H*:*
MM*
, prefixed with a+
or-
, such as'+10:00'
,'-6:00'
, or'+05:30'
. A leading zero can optionally be used for hours values less than 10; MySQL prepends a leading zero when storing and retriving the value in such cases.允许取值SYSTEM:
set time_zone='SYSTEM'
3)设置全局时区:set global time_zone='+8:00
全局会话有效。必须重新连接才生效(比如exit后重新mysql -uroot -p
进行连接)。无需重启mysql服务,重启 mysql 服务后丢失。
网上贴的是两个语句,需要 flush privileges,但是实际测试即使flush了也还是需要重新连接会话才会生效,而且看了下官网,没flush的语句。而且实测不需要flush只需要重连
4)修改 mysql 的配置文件永久设置时区
需要重启 mysql 服务后才能生效,这个对比上面的全局设置,即使服务重启也是能保持配置。配置后跟数据库所在的操作系统的时区就独立开了。
// 下面是5.7的mysql配置,我看了一下8.x版本的mysql也是同样的配置,不过mysql 8.x 默认就是 utf8mb4了,所以字符设置的那行就不需要了
// 配置的位置,无论5.7还是8.x版本,都必须配在 [mysqld] 下面
[mysqld]
default-time-zone=+08:00
character-set-server=utf8mb4
2、如何查看并读懂这些命令
1)、解读查时区的命令返回的结果
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | +08:00 |
+------------------+--------+
要知道mysql当前在什么时区,看哪个变量?
看 time_zone。不看 system_time_zone。如要修改时区,直接修改 time_zone,无视 system_time_zone
time_zone 的值如果是 SYSTEM 表示什么?
表示跟 system_time_zone 取值一样。安装MySQL后默认就是SYSTEM。
有些地方会表述成 SYSTEM 的含义是 "时区跟随操作系统","跟随操作系统和跟随system_time_zone" 其实是一样的意思,因为 system_time_zone 就是启动mysql服务的时候读取了操作系统的时区的值。
建议time_zone不要设置成 SYSTEM
因为如果 system_time_zone 的值是CST,CST被Java认为是美国的时间,造成混乱。参考后面由此引起的bug
system_time_zone 的值是怎么来的?
它的值来自mysql服务启动时读取操作系统时区,读取后即使修改操作系统的时区,它的值也不会再改变了,除非重启mysql 服务变量重新读取
system_time_zone 的值能改变吗?
不能通过命令改变
mysql> set system_time_zone='JST'; ERROR 1238 (HY000): Variable 'system_time_zone' is a read only variable
如何确定CST代表什么时区?
由于中国和美国的时区同名,要知道CST究竟代表什么时区,最简单的方法是
select now()
跟你手机的时间对比一下
3、探讨一个问题
如果OS是东八区,mysql服务起来了,time_zone值是SYSTEM,system_time_zone值是CST(东八区),此时连上mysql获取的时间是东八区的,接着修改OS的时区为东九区,断开mysql连接的会话并重新连接会话,问此时获取的时间是什么时区的? (实测还是东八区)
这个问题的本质就是:time_zone的SYSTEM的值的含义,究竟是跟随启动mysql服务就确定下来的system_time_zone的值呢? 还是跟随操作系统的变化而变化。
实际测试,是跟随system_time_zone变量的变化而变化,而非系统,也就是说time_zone是SYSTEM值,只跟system_time_zone变量有关。而system_time_zone仅仅是启动mysql服务的时候操作系统的一个时区的快照值而已(那一瞬间的值)
4、恶心的CST(修改time_zone改成非SYSTEM!)
CST同名的有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 古巴标准时间
这个不仅仅是重名的问题,而且在某些情况下会造成bug,详细看另一篇博文。这里简单说一下
CST 时区是个非常坑的概念,因为在 mysql 里被理解为 China Standard Time
(GMT+8),但是在Java里被理解为Central Standard Time (USA)
(GMT-6),这就是造成坑的原因。解决办法是mysql就别用CST时区,改成 +08:00
以免造成误解。(肯定改mysql啦,你改得了jdk源码吗?)
如果mysql的time_zone变量是SYSTEM,而system_time_zone是CST的值,system_time_zone的CST这个字符串会造成bug。
mysql的jdbc驱动的代码里会设置时区,这个时区是通过 TimeZone.getTimeZone(canonicalTimezone)
读取,其中 canonicalTimezone
是字符串, TimeZone.getTimeZone("CST")
返回-6时区,即美国的时区。
解决办法:
- 数据库设置time_zone的值为非SYSTEM,比如+08:00
- spring/springboot等程序连接的时候,jdbcUrl带上时区,比如
jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
参考资料
https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html
https://dev.mysql.com/doc/refman/5.7/en/datetime.html
关于mysql的时区(下):如何设置mysql的时区相关推荐
- 【MySql】linux下,设置mysql表名忽略大小写
[障碍再现] 状况描述01: 在LINUX下调一个程序经常报出找不到表,但是我明明是建了表的, 测试的时候,遇到一些问题,从Windows平台访问虚拟机中的Web应用,经常报出找不到表,但自己明明在数 ...
- linux mysql如何远程连接mysql数据库,Linux下远程连接MySQL数据库的方法
Linux下远程连接MySQL数据库的方法 踩坑笔记 估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 1.在服务器端开启远程访问 首先进入mysql数据 ...
- mysql中如何设置时区_如何设置MySQL的时区?
我认为这可能是有用的: 有三个位置可以在MySQL中设置时区: 在[mysqld]部分中的"my.cnf"文件中default-time-zone='+00:00' @global ...
- mysql 时区设定_设置MySQL默认时区
MySQL默认的时区是UTC时区,比北京时间晚8个小时. 假设日志里面的时间是中午12:00,那么北京时间应该是晚上的8:00点钟. 为方便查看和设置时间,我们要设置MySQL的默认时区,以符合本地使 ...
- linux设置mysql定时任务_Linux下如何实现Mysql定时任务
假设前提:每天晚上10点到早上5点,每10分钟定时执行存储过程. 实现方式: 第一种是利用mysql本身实现,制定event定时任务,可以借助navicat for mysql或其他数据库开发工具去做 ...
- mysql使用大内存页面,设置MySQL使用大内存页面
一般情况下使用的内存为每页4K,使用 huge page 的话默认是每页 2M.如果设置MySQL使用 huge page 至少有两个好处,一个是可以减少 Translation Lookaside ...
- linux 把mysql大小写关闭_linux中设置mysql大小写不去区分方法
linux中设置mysql大小写不去区分方法 发布时间:2020-05-14 12:01:31 来源:亿速云 阅读:191 作者:三月 本文主要给大家介绍linux中设置mysql大小写不去区分方法, ...
- linux c mysql教程_linux下c操作mysql之增删改查
书接上文,继续进行linux 下c操作mysql. 1.创建表/插入数据 mysql> desc children -> ; +---------+-------------+------ ...
- mysql 重置root密码 远程访问_重置mysql的root密码以及设置mysql远程登陆权限
root 密码忘记,重置mysql的root密码 :t 一.修改mysql的配置文件my.cnf 1. 在[mysqld]的段中加上一句:skip-grant-tables [mysqld] data ...
- windows进入mysql改user_windows下如何修改mysql数据库密码
先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的,所以一般用户无法更改密码,除非请求管理员. 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user ...
最新文章
- ZooKeeper伪分布式集群安装
- MySql采用range分区可提升查询效率
- 视频会议未来趋势不完全预测
- 深度学习pytorch--MNIST数据集
- 数据分析师 需求分析师_是什么让分析师出色?
- 【JavaScript】将浮点数与整数分开
- 使用Nacos搭建微服务注册中心和配置中心(二)
- 酷狗笔试题:补齐左括号(栈)
- TensorFlow工具及笔记
- JAVA 入门PDF
- Qt--自定义Delegate
- USART串口驱动SIM800L或者ESP8266
- 北航计算机录取最低分,2019年北京航空航天大学考研复试最低分数要求_北航各科目分数线-聚英北航考研网...
- 跑步机上的精彩人生——Linus大神传奇
- Reading Ingestion —— Paxos Made Simple
- flappy+bird+c语言程序,C语言实现flappy bird游戏
- 阿里巴巴2008校园招聘在线宣讲会
- PopCap地图卷动(一)
- 重生的自己,仅此纪念2013年7月25日
- 微信公众平台的TOKEN安全验证
热门文章
- Python爬虫之使用正则表达式匹配网页内容
- echarts-地图使用/配合散点图展示空气质量
- wow服务器合并信息,WOW魔兽世界5月21日大服务合并维护 二区合并至电信区
- 每日英语:China Bridge Collapse Raises Infrastructure Concerns
- 修复 iPhone X H5 底部安全区域定位按钮下内容穿透 BUG
- SpringBoot 使用Prometheus采集自定义指标数据
- linux位系统安装官方install_flash_player_npapi_linux.x86_64.tar.gz插件包的方法
- 进程和计划任务管理|linux
- Android仿微信朋友圈九宫格图片展示自定义控件,支持缩放动画~
- 5G+智慧矿山系统如何降低开发成本