欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL總是差八個(gè)小時(shí)該如何解決

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

前言

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

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

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

1. MySQL 本身問題

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

select now();

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

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

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

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

show variables like '%time_zone%';

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

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

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

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

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

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

set global time_zone = Asia/Shanghai

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

首先我們要確認(rèn) MySQL 沒問題。

2. JDBC 連接問題

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

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

首先我們來準(zhǔn)備一個(gè)表,如下:

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;

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

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

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

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

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

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

小伙伴們看一下,在數(shù)據(jù)庫連接地址中,我特意設(shè)置了時(shí)區(qū)為 UTC,這個(gè)時(shí)區(qū)比我們目前的時(shí)區(qū)慢了 8 小時(shí),我們來看看用這樣一個(gè)錯(cuò)誤的時(shí)區(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);
}

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

為啥呢?

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

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

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

3. 題外話

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

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

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

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

4. 小結(jié)

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

相關(guān)文章

  • MySQL中的隱藏列的具體查看

    MySQL中的隱藏列的具體查看

    mysql中存在一些隱藏列,例如行標(biāo)識(shí)、事務(wù)ID、回滾指針等,不知道大家是否和我一樣好奇過,要怎樣才能實(shí)際地看到這些隱藏列的值呢,感興趣的可以了解一下
    2021-09-09
  • MySQL的重裝問題解決方法

    MySQL的重裝問題解決方法

    最近在工作上遇到了MySQL重裝的問題,今天記錄一下我的解決過程。不論我用控制面板的卸載刪除程序方式還是安全衛(wèi)士的卸載,都會(huì)遇到一個(gè)問題,就是安裝到如下圖位置,server start時(shí)就程序無響應(yīng)了,一直死在那里
    2013-04-04
  • MySQL基礎(chǔ)教程之事務(wù)異常情況

    MySQL基礎(chǔ)教程之事務(wù)異常情況

    事務(wù)(Transaction)是訪問和更新數(shù)據(jù)庫的程序執(zhí)行單元;事務(wù)中可能包含一個(gè)或多個(gè)sql語句,這些語句要么都執(zhí)行,要么都不執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于MySQL基礎(chǔ)教程之事務(wù)異常情況的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • MySQL  外鍵(foreign key)約束的作用和使用

    MySQL  外鍵(foreign key)約束的作用和使用

    外鍵約束是用于建立兩個(gè)表之間關(guān)系的一種約束,本文主要介紹了MySQL外鍵約束詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • windows10安裝mysql5.7.17教程

    windows10安裝mysql5.7.17教程

    windows10安裝mysql5.7.17是這樣安裝的嗎?這篇文章主要為大家詳細(xì)介紹了win10下mysql5.7.17安裝配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL學(xué)習(xí)之三大范式詳解小白篇

    MySQL學(xué)習(xí)之三大范式詳解小白篇

    本篇文章為大家介紹了MYSQL數(shù)據(jù)庫學(xué)習(xí)中三大范式的規(guī)則詳解,有需要的朋友可以借鑒參考下,希望可以對(duì)大家的數(shù)據(jù)庫學(xué)習(xí)有所幫助
    2021-09-09
  • MySQL導(dǎo)致索引失效的幾種情況

    MySQL導(dǎo)致索引失效的幾種情況

    本文主要介紹了MySQL導(dǎo)致索引失效的幾種情況,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • MySql 5.7.20安裝及data和my.ini文件的配置

    MySql 5.7.20安裝及data和my.ini文件的配置

    本文通過圖文并茂的形式給大家介紹了MySql 5.7.20安裝及data和my.ini文件的配置方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-11-11
  • MySQL 5.7中的關(guān)鍵字與保留字詳解

    MySQL 5.7中的關(guān)鍵字與保留字詳解

    最近在將數(shù)據(jù)從Oracle遷移到MySQL的過程中,遇到一些問題,其中就包括關(guān)鍵字。下面這篇文章主要給大家介紹了MySQL 5.7中的關(guān)鍵字與保留字的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-03-03
  • MySQL優(yōu)化中B樹索引知識(shí)點(diǎn)總結(jié)

    MySQL優(yōu)化中B樹索引知識(shí)點(diǎn)總結(jié)

    在本文里我們給大家整理了關(guān)于MySQL優(yōu)化中B樹索引的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2019-02-02

最新評(píng)論