最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL總是差八個小時該如何解決

 更新時間:2022年04月13日 14:53:14   作者:江南一點雨  
最近在用mybatis時發(fā)現(xiàn),將LocalDateTime插入到數(shù)據(jù)庫時時間少了8小時,下面這篇文章主要給大家介紹了關(guān)于MySQL總是差八個小時該如何解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

今天來聊一個簡單的話題,這是一個小伙伴在微信上問我的,對于初學(xué)者我非常能理解這類問題帶來的困擾,各種嘗試,各種搜索,別人說的頭頭是道,但是就是解決不了自己的問題,今天我簡單從兩個方面來和大家聊聊這個問題,如果小伙伴們有其他的解決思路,也可以留言一起分享。

這個問題我們可以從兩方面來分析:

  • MySQL 本身的問題。
  • Java 代碼的問題。

1. MySQL 本身問題

MySQL 本身問題,這個其實很好驗證,不就是時間么,我們執(zhí)行如下 SQL 看看 MySQL 上的時間跟我的電腦時間是否是一致的:

select now();

可以看到,MySQL 的這個時間跟我系統(tǒng)的時間其實就差了 8 小時,MySQL 本身的時間都不對,那你將來插入/查詢的時間肯定也不對。

這個查詢大家注意,要么使用命令行操作,要么使用 Sqlyog、Navicat 或者 Sequel Pro 之類的數(shù)據(jù)庫工具來操作,切勿使用 JDBC 來查詢,具體原因一會看完第二小節(jié)就明白了。

出現(xiàn)這個問題,多半是 MySQL 的時區(qū)不太對,我們重新給其設(shè)置一下時區(qū)即可。

首先我們通過如下指令來查看一下 MySQL 當(dāng)前的時區(qū):

show variables like '%time_zone%';

可以看到,MySQL 說它的時區(qū)是 SYSTEM,那 SYSTEM 又是啥呢?第一條說了 SYSTEM 是 UTC(協(xié)調(diào)世界時,又稱世界標準時間或世界協(xié)調(diào)時間)。而我們的北京時間比 UTC 快了 8 小時,即 UTC+8。

所以我們現(xiàn)在要把 MySQL 的時區(qū)先給改對,可以通過修改配置文件來實現(xiàn)(/etc/mysql/mysql.conf.d/mysqld.cnf),如下:

修改完成后,重啟 MySQL,再來查看 MySQL 的時區(qū):

可以看到,此時的 MySQL 時區(qū)就正常了。

那么此時再執(zhí)行 select now(); 也就不會有問題了:

有的小伙伴可能嫌修改配置文件太麻煩了,那么也可以通過 SQL 來修改時區(qū):

set global time_zone = Asia/Shanghai

注意我們所在的時區(qū)是 Asia/Shanghai,小伙伴們不要自由發(fā)揮寫其他城市。

首先我們要確認 MySQL 沒問題。

2. JDBC 連接問題

當(dāng)確認了 MySQL 沒有問題后,如果你的 MySQL 時間還是不對,那么就有可能是 JDBC 連接的問題了。

這里我用大家常見的 JdbcTemplate 來舉個例子,其他的數(shù)據(jù)庫框架操作也都是一樣的,我這里主要是演示時區(qū)問題,數(shù)據(jù)操作細節(jié)問題就不再展示了。

首先我們來準備一個表,如下:

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `createTime` datetime DEFAULT NULL,
  `updateTime` timestamp NULL DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

很簡單的幾個字段,createTime 是 datetime 類型,updateTime 是 Timestamp 類型。

然后向表中添加一條記錄:

并且這個數(shù)據(jù)庫的時區(qū)是 Asia/Shanghai

接下來我們創(chuàng)建一個 Spring Boot 項目,引入 Web、JDBC API 依賴和 MySQL 驅(qū)動,如下:

然后我們來配置一下 MySQL 的連接信息,如下:

spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///test01?serverTimezone=UTC

小伙伴們看一下,在數(shù)據(jù)庫連接地址中,我特意設(shè)置了時區(qū)為 UTC,這個時區(qū)比我們目前的時區(qū)慢了 8 小時,我們來看看用這樣一個錯誤的時區(qū),操作的結(jié)果是什么樣子的。

@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
    List<User> list = jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));
    System.out.println("list = " + list);
}

大家看到,這個查詢結(jié)果查到的時間是 21 點,跟 13 點相比快了 8 小時。

為啥呢?

因為我們連接地址中加了 serverTimezone=UTC 參數(shù),這個時候,系統(tǒng)會把從數(shù)據(jù)庫查詢到的數(shù)據(jù)當(dāng)成是 UTC 時區(qū)的,即把 13 點當(dāng)成 UTC 時區(qū)的,但是我自己當(dāng)前設(shè)備又是 Asia/Shanghai 時區(qū),UTC 時區(qū)的 13 點轉(zhuǎn)成 Asia/Shanghai 時區(qū)之后就是 21 點了。

相同道理,大家也可以自行嘗試設(shè)置 serverTimezone=Asia/Tokyo,時區(qū)設(shè)置為東京,東京比我們早一個小時,東京的 13 點就是我們的 12 點,那么最終查詢結(jié)果就是 12 點。

從這個案例中我們可以看到,jdbc 連接參數(shù)中的時區(qū)優(yōu)先級高于 MySQL 服務(wù)器的時區(qū)參數(shù),所以這個連接參數(shù)大家也要尤其注意。

3. 題外話

有的小伙伴遇到的時區(qū)問題則是另外一種,返回 JSON 的時候時間不對。

如果在項目中用了 jackson,并且使用 @JsonFormat 注解來格式化日期,就有可能出現(xiàn)時區(qū)問題,如下:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")

大家看到,這段代碼如果沒有設(shè)置 timezone 屬性,那么默認的時區(qū)就是 UTC,也會導(dǎo)致最終的時間差了 8 小時。

4. 小結(jié)

到此這篇關(guān)于MySQL總是差八個小時該如何解決的文章就介紹到這了,更多相關(guān)MySQL差八個小時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 分享8個不得不說的MySQL陷阱

    分享8個不得不說的MySQL陷阱

    這篇文章給大家分享8個不得不說的MySQL陷阱,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • 深度解析MySQL啟動時報“The server quit without updating PID file”錯誤的原因

    深度解析MySQL啟動時報“The server quit without up

    這篇文章主要介紹了MySQL啟動時報“The server quit without updating PID file”錯誤的原因,需要的朋友可以參考下
    2017-05-05
  • Can''t connect to MySQL server on ''localhost'' (10048)問題解決方法

    Can''t connect to MySQL server on ''localhost'' (10048)問題解決方

    windows 2003服務(wù)器運行php的提示Can't connect to MySQL server on 'localhost' (10048), 下面來看下解決方法
    2013-09-09
  • MySQL占用內(nèi)存過大解決方案圖文詳解

    MySQL占用內(nèi)存過大解決方案圖文詳解

    最近無意中在任務(wù)管理器發(fā)現(xiàn)MySQL內(nèi)存占用達到700+M,所以下面這篇文章主要給大家介紹了關(guān)于MySQL占用內(nèi)存過大的完美解決方案,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • MySQL查看版本的五種方法總結(jié)

    MySQL查看版本的五種方法總結(jié)

    在日常項目開發(fā)過程中,我們經(jīng)常要連接自己的數(shù)據(jù)庫,此時不知道數(shù)據(jù)庫的版本是萬萬不可的,下面這篇文章主要給大家介紹了關(guān)于MySQL查看版本的五種方法,需要的朋友可以參考下
    2023-02-02
  • MySQL慢日志實踐小結(jié)

    MySQL慢日志實踐小結(jié)

    這篇文章主要介紹了MySQL慢日志實踐小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • MySQL批量插入唯一索引沖突的幾種避免辦法

    MySQL批量插入唯一索引沖突的幾種避免辦法

    我們在進行大批量的數(shù)據(jù)插入時,遇到唯一索引沖突是經(jīng)常的事,本文主要介紹了MySQL批量插入唯一索引沖突的幾種避免辦法,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • MGR集群搭建及配置過程

    MGR集群搭建及配置過程

    MGR是MySQL數(shù)據(jù)庫未來發(fā)展的一個重要方向,本文重點給大家介紹MGR集群搭建過程分析,對MGR集群搭建相關(guān)知識感興趣的朋友一起看看吧
    2022-02-02
  • 深入理解MySQL公共表表達式

    深入理解MySQL公共表表達式

    公用表達式是MySQL8.0的新特性,它是一個命名的臨時結(jié)果集,作用范圍是當(dāng)前語句,本文主要介紹了MySQL公共表表達式使用,感興趣的可以了解一下
    2024-09-09
  • Mysql源碼學(xué)習(xí)筆記 偷窺線程

    Mysql源碼學(xué)習(xí)筆記 偷窺線程

    安裝完Mysql后,使用VS打開源碼開開眼,我嘞個去,這代碼和想象中怎么差別這么大呢?
    2011-04-04

最新評論

新邵县| 霸州市| 桂阳县| 舟曲县| 札达县| 汤原县| 合阳县| 永城市| 丹东市| 凤阳县| 璧山县| 昌宁县| 罗平县| 延安市| 石景山区| 苍南县| 普兰店市| 封丘县| 胶州市| 准格尔旗| 武陟县| 安义县| 巩义市| 全南县| 洞头县| 清水河县| 鄂托克旗| 白城市| 叙永县| 通化市| 扶绥县| 手游| 承德县| 潞西市| 敦化市| 柳州市| 宁化县| 紫金县| 宜春市| 巩义市| 阳春市|