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

mysql里CST時(shí)區(qū)的坑及解決

 更新時(shí)間:2023年10月12日 09:50:00   作者:石頭wang  
這篇文章主要介紹了mysql里CST時(shí)區(qū)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、問(wèn)題簡(jiǎn)述

mysql 里 CST 時(shí)區(qū)是個(gè)非??拥母拍睿?yàn)樵?mysql 里CST既表示中國(guó)也表示美國(guó)的時(shí)區(qū)。

但是在Jdk代碼里,CST 這個(gè)字符串被理解為Central Standard Time (USA)(GMT-6),這就是造成坑的原因。

解決辦法:

mysql 的 time_zone配置 不要用SYSTEM,因?yàn)橛昧司褪歉S system_time_zone 的值,而 system_time_zone 讀取自數(shù)據(jù)庫(kù)所在宿主機(jī)的操作系統(tǒng),常常是 CST 的值。

解決辦法是將 time_zone 改成例如 +08:00 以免造成誤解。(肯定改mysql啦,你改得了jdk源碼嗎?)。

修改方法見(jiàn)后文

二、查看、修改時(shí)區(qū)

1、怎么查看mysql是什么時(shí)區(qū)?

選一個(gè)即可

方法1:

命令: 連上mysql后命令行執(zhí)行 show variables like '%time_zone%' (Navicat連上后執(zhí)行也行)

結(jié)果:

system_time_zone	CST
time_zone	SYSTEM

看time_zone就行了,SYSTEM表示其值跟隨system_time_zone。

而system_time_zone的CST值,是表示中國(guó)呢,還是美國(guó),是不清楚的,你直接再執(zhí)行 select now() 跟你手機(jī)的時(shí)間對(duì)比一下就清楚了。

為什么會(huì)system_time_zone和time_zone兩個(gè)? 要看哪個(gè)? 不急后面會(huì)解釋

方法2:

命令:連上mysql后命令行執(zhí)行 (Navicat連上后執(zhí)行也行)

  // 分兩次執(zhí)行下面2條命令
  select @@system_time_zone;
  select @@time_zone;

結(jié)果:

  select @@system_time_zone;
  +--------------------+
  | @@system_time_zone |
  +--------------------+
  | CST                |
  +--------------------+
  1 row in set (4.81 sec)
  mysql> select @@time_zone;
  +-------------+
  | @@time_zone |
  +-------------+
  | SYSTEM      |
  +-------------+
  1 row in set (0.04 sec)

方法3:

// 查出全局時(shí)區(qū)和會(huì)話時(shí)區(qū)
select @@GLOBAL.time_zone,@@SESSION.time_zone;

為什么mysql有system_time_zone和time_zone兩個(gè)

見(jiàn) https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html

簡(jiǎn)單說(shuō)就是system_time_zone就是mysql服務(wù)(即mysqld)啟動(dòng)的時(shí)候讀取數(shù)據(jù)庫(kù)所在宿主機(jī)的時(shí)區(qū),固定下來(lái)的值,這個(gè)值之后不再改變(除非重啟mysql服務(wù))。time_zone的值未SYSTEM,意思是它的時(shí)區(qū)跟system_time_zone一樣(注意system_time_zone的值固定下來(lái)后,數(shù)據(jù)庫(kù)宿主機(jī)的時(shí)區(qū)再改變,time_zone的值都是不變的,因?yàn)樗歉Ssystem_time_zone變量的,不是實(shí)時(shí)跟隨操作系統(tǒng)的)

存在 “為什么linux時(shí)區(qū)是對(duì)的,但是mysql的時(shí)區(qū)是錯(cuò)的” 的疑惑,因?yàn)閱?dòng)mysql服務(wù)時(shí)如果linux時(shí)區(qū)是錯(cuò)的,把mysql的時(shí)區(qū)也帶錯(cuò)了,只是后來(lái)你發(fā)現(xiàn)linux時(shí)區(qū)錯(cuò)了于是改對(duì)了,但是你忘記啟動(dòng)mysql的時(shí)候linux時(shí)區(qū)是錯(cuò)的,而且你忘了是后來(lái)你才把linux的時(shí)區(qū)改正確的,所以你有這個(gè)的疑惑。我好像也有過(guò)這樣的疑惑

2、如何修改mysql的時(shí)區(qū)

永久修改,改配置文件,重啟mysql服務(wù)也有效

修改 my.cnf 文件,在 [mysqld] 節(jié)下增加 default-time-zone = '+08:00'

沒(méi)有這個(gè)文件的話,見(jiàn)后文,讓你的mysql啟動(dòng)的時(shí)候讀取配置文件。

臨時(shí)修改,重啟mysql服務(wù)后丟失

選擇下面之一執(zhí)行即可。

  • 修改會(huì)話級(jí)別定的,關(guān)閉會(huì)話后就會(huì)失效,也僅僅影響當(dāng)前會(huì)話窗口:set time_zone='+08:00';
  • 全局修改,重啟mysql服務(wù)后丟失,對(duì)所有會(huì)話生效:`set global time_zone=’+08:00’;

三、這個(gè)bug 是怎么產(chǎn)生的

下面基于mysql-connector-java-8.0.19 進(jìn)行分析,使用 com.mysql.cj.jdbc.Driver

在獲取java.sql.Connection的過(guò)程會(huì)確定時(shí)區(qū),調(diào)用如下方法

com.mysql.cj.protocol.a.NativeProtocol#configureTimezone
/**
    * Configures the client's timezone if required.
    * 
    * @throws CJException
    *             if the timezone the server is configured to use can't be
    *             mapped to a Java timezone.
    */
public void configureTimezone() {
String configuredTimeZoneOnServer = this.serverSession.getServerVariable("time_zone");
if ("SYSTEM".equalsIgnoreCase(configuredTimeZoneOnServer)) {
configuredTimeZoneOnServer = this.serverSession.getServerVariable("system_time_zone");
}
String canonicalTimezone = getPropertySet().getStringProperty(PropertyKey.serverTimezone).getValue();
if (configuredTimeZoneOnServer != null) {
// user can override this with driver properties, so don't detect if that's the case
if (canonicalTimezone == null || StringUtils.isEmptyOrWhitespaceOnly(canonicalTimezone)) {
    try {
    canonicalTimezone = TimeUtil.getCanonicalTimezone(configuredTimeZoneOnServer, getExceptionInterceptor());
    } catch (IllegalArgumentException iae) {
    throw ExceptionFactory.createException(WrongArgumentException.class, iae.getMessage(), getExceptionInterceptor());
    }
}
}
if (canonicalTimezone != null && canonicalTimezone.length() > 0) {
this.serverSession.setServerTimeZone(TimeZone.getTimeZone(canonicalTimezone));
//
// The Calendar class has the behavior of mapping unknown timezones to 'GMT' instead of throwing an exception, so we must check for this...
//
if (!canonicalTimezone.equalsIgnoreCase("GMT") && this.serverSession.getServerTimeZone().getID().equals("GMT")) {
    throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("Connection.9", new Object[] { canonicalTimezone }),
                                            getExceptionInterceptor());
}
}
this.serverSession.setDefaultTimeZone(this.serverSession.getServerTimeZone());
}

大概邏輯如下:

  • 從mysql的time_zone讀取值
  • 如果值是SYSTEM則使用system_time_zone的值
  • 如果jdbc url配置了時(shí)區(qū)則使用url里的,如 jdbc:mysql://localhost:3306/test?useSSL=true&serverTimezone=Asia/Shanghai獲取的是字符串配置定的

如果獲取到CST,則因?yàn)樵趈ava里 TimeZone("CST")表示美國(guó)中部時(shí)間,與mysql數(shù)據(jù)庫(kù)用 CST 表示中國(guó)時(shí)區(qū)的含義就不同了,bug就是這么產(chǎn)生的。

四、其他問(wèn)題

1、CST究竟是美國(guó)還是中國(guó)

其實(shí)CST總共有4個(gè)含義

  • China Standard Time:中國(guó)標(biāo)準(zhǔn)時(shí)間
  • Central Standard Time (USA) :美國(guó)中部時(shí)間(中部就是在國(guó)土的中間的部分,例如芝加哥)
  • Central Standard Time (Australia):澳大利亞中部時(shí)間
  • Cuba Standard Time:古巴標(biāo)準(zhǔn)時(shí)間

就是因?yàn)檫@個(gè)含義不清,所以會(huì)有坑,體現(xiàn)在Java里就是

// 不建議這么創(chuàng)建 TimeZone,這里的CST指的是美國(guó)中部時(shí)間,不是中國(guó),從
TimeZone tz = TimeZone.getTimeZone("CST");
System.out.println(tz);// 可以看到偏移量是offset=-21600000,-21600000微秒=-6小時(shí),所以實(shí)錘這里的CST指美國(guó)
// 建議創(chuàng)建 TimeZone 用 ZoneId,因?yàn)閆oneId 不允許 CST、JST 這種簡(jiǎn)稱,能提前預(yù)防進(jìn)坑,如下
// ZoneId zoneId = ZoneId.of("CST");// 拋異常
ZoneId zoneId = ZoneId.of("GMT+8");// 明確指定,是OK的,或者 "區(qū)域/城市" 的寫(xiě)法如 Asia/Shanghai
TimeZone tz1 = TimeZone.getTimeZone(zoneId);

體現(xiàn)在Mysql里

你根本不知道m(xù)ysql里的CST是中國(guó)還是美國(guó),查出來(lái)都展示一樣

(關(guān)于system_time_zone和time_zone后續(xù)有解釋)

2、你說(shuō)CST除了表示中國(guó),也表示美國(guó)定的時(shí)區(qū),拿得出證據(jù)嗎?

是的!!! 動(dòng)手做實(shí)驗(yàn)給你看 !!!

使用show variables like '%time_zone%'; 查看mysql的時(shí)區(qū),目前是北京時(shí)間,查出

Variable_name	Value
system_time_zone	CST
time_zone	SYSTEM

當(dāng)把操作系統(tǒng)(mysql的宿主機(jī)器的操作系統(tǒng))的時(shí)區(qū)改成東京時(shí)區(qū),并重啟mysql服務(wù)后(必須重啟服務(wù)),顯示

Variable_name	Value
system_time_zone	JST
time_zone	SYSTEM

最后把操作系統(tǒng)時(shí)區(qū)改成美國(guó)中部時(shí)間(如芝加哥),并重啟mysql服務(wù)后,顯示

Variable_name	Value
system_time_zone	CST
time_zone	SYSTEM

可以看到非??樱瑹o(wú)論是中國(guó)還是美國(guó),都顯示CST,給人很大的誤解

五、其他

1、mybatis/jdbc 是怎么將日期存入到數(shù)據(jù)庫(kù)的,又是怎么查出來(lái)的

(這個(gè)實(shí)在有點(diǎn)復(fù)雜,要考慮mysql所在操作系統(tǒng)的時(shí)區(qū),也考慮跑你的mysql程序的web服務(wù)器的操作系統(tǒng)的時(shí)區(qū)。加又沒(méi)時(shí)間繼續(xù)研究了,緩一緩)

2、再次啰嗦補(bǔ)充

mysql里的 system_time_zone 和 time_zone是什么關(guān)系

system_time_zone 是mysql服務(wù)啟動(dòng)時(shí)讀取宿主操作系統(tǒng)的時(shí)區(qū),當(dāng)時(shí)讀取到什么值就固定什么,是那個(gè)時(shí)刻的快照。這個(gè)值只有在被重新指定或重啟mysql服務(wù)的時(shí)候才可能變化。

time_zone就是表示所有連接到此mysql的客戶端(client)的時(shí)區(qū),不管你是什么形式的客戶端,是java通過(guò)jdbc連接的程序,還是Navicat這種圖形化的,還是命令行的,都叫客戶端。這個(gè)時(shí)區(qū)是可以被覆蓋的,可以被jdbcUrl中的時(shí)區(qū)覆蓋。

在jdbc的URL里配置了時(shí)區(qū)會(huì)怎么樣?

會(huì)使用這個(gè)時(shí)區(qū),在jdbcUrl里指定的時(shí)區(qū)優(yōu)先級(jí)最高,會(huì)覆蓋其他。

例如 jdbc:mysql://localhost:3306/test?useSSL=true&serverTimezone=Asia/Shanghai

  • time_zone的SYSTEM是什么意思,是不是指 “操作系統(tǒng)” 的時(shí)區(qū)?
  • time_zone的SYSTEM,是指值跟隨 system_time_zone 的值,不是說(shuō)跟隨操作系統(tǒng)的值,操作系統(tǒng)的時(shí)區(qū)改了,如果 system_time_zone 不改,則 time_zone 也是不會(huì)改的(親自實(shí)驗(yàn)過(guò)了!!)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢以及統(tǒng)計(jì)問(wèn)題

    Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢以及統(tǒng)計(jì)問(wèn)題

    有時(shí)為了數(shù)據(jù)庫(kù)簡(jiǎn)潔,存放數(shù)據(jù)的時(shí)候,某一字段采用逗號(hào)隔開(kāi)的形式進(jìn)行存儲(chǔ),下面這篇文章主要給大家介紹了關(guān)于Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢以及統(tǒng)計(jì)問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • MySQL性能壓力基準(zhǔn)測(cè)試工具sysbench的使用簡(jiǎn)介

    MySQL性能壓力基準(zhǔn)測(cè)試工具sysbench的使用簡(jiǎn)介

    這篇文章主要介紹了MySQL性能壓力基準(zhǔn)測(cè)試工具sysbench的使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • mysql啟動(dòng)時(shí)出現(xiàn)ERROR 2003 (HY000)問(wèn)題的解決方法

    mysql啟動(dòng)時(shí)出現(xiàn)ERROR 2003 (HY000)問(wèn)題的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql啟動(dòng)時(shí)出現(xiàn)ERROR 2003 (HY000問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Centos?7.9安裝MySQL8.0.32的詳細(xì)教程

    Centos?7.9安裝MySQL8.0.32的詳細(xì)教程

    這篇文章主要介紹了Centos7.9安裝MySQL8.0.32的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • MySQL優(yōu)化之對(duì)RAND()的優(yōu)化方法

    MySQL優(yōu)化之對(duì)RAND()的優(yōu)化方法

    這篇文章主要介紹了MySQL優(yōu)化之對(duì)RAND()的優(yōu)化方法,本文詳細(xì)分析了Mysql中對(duì)RAND()的幾種優(yōu)化方法,并最終得出一個(gè)結(jié)論,需要的朋友可以參考下
    2014-07-07
  • MySQL高級(jí)查詢示例詳細(xì)介紹

    MySQL高級(jí)查詢示例詳細(xì)介紹

    這篇文章主要介紹了MySQL高級(jí)查詢示例,在面試過(guò)程中經(jīng)常會(huì)遇到sq查詢問(wèn)題,今天小編通過(guò)本文給大家介紹下MySQL高級(jí)查詢語(yǔ)法分析,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • MySQL無(wú)服務(wù)及服務(wù)無(wú)法啟動(dòng)的終極解決方案分享

    MySQL無(wú)服務(wù)及服務(wù)無(wú)法啟動(dòng)的終極解決方案分享

    又是MySQL的問(wèn)題,之前已經(jīng)遇見(jiàn)過(guò)一次本地MySQL服務(wù)無(wú)法啟動(dòng)的情況,現(xiàn)在又出現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于MySQL無(wú)服務(wù)及服務(wù)無(wú)法啟動(dòng)的終極解決方案,需要的朋友可以參考下
    2022-06-06
  • MySQL查詢優(yōu)化之查詢慢原因和解決技巧

    MySQL查詢優(yōu)化之查詢慢原因和解決技巧

    這篇文章主要介紹了MySQL查詢優(yōu)化之查詢慢原因和解決技巧,內(nèi)容講解的很詳細(xì),有對(duì)于這方面不太懂的同學(xué)可以研究一下。
    2021-02-02
  • 使用innodb_force_recovery解決MySQL崩潰無(wú)法重啟問(wèn)題

    使用innodb_force_recovery解決MySQL崩潰無(wú)法重啟問(wèn)題

    這篇文章主要介紹了使用innodb_force_recovery解決MySQL崩潰無(wú)法重啟問(wèn)題,這只一個(gè)成功案例,并不是萬(wàn)能的解決方法,需要酌情考慮,需要的朋友可以參考下
    2015-05-05
  • 詳解SparkSql輸出數(shù)據(jù)的方式

    詳解SparkSql輸出數(shù)據(jù)的方式

    在處理數(shù)據(jù)時(shí),SparkSql提供了多種數(shù)據(jù)輸出方式,包括普通文件輸出、保存到數(shù)據(jù)庫(kù)和保存到Hive,普通文件輸出支持追加模式、覆寫(xiě)模式、報(bào)錯(cuò)模式和忽略模式,本文介紹SparkSql輸出數(shù)據(jù)的方式,感興趣的朋友一起看看吧
    2024-11-11

最新評(píng)論

芦溪县| 栾川县| 北安市| 乐都县| 汝城县| 杂多县| 彰化市| 赤峰市| 哈尔滨市| 县级市| 偃师市| 阿坝县| 莎车县| 额尔古纳市| 嘉善县| 敦化市| 响水县| 阳城县| 阿拉尔市| 新竹市| 夹江县| 汝城县| 河曲县| 屏东县| 长沙县| 昌图县| 泸西县| 山东省| 海南省| 宁化县| 丰宁| 邵阳市| 原平市| 天门市| 绥滨县| 磴口县| 永兴县| 科技| 平果县| 台北市| 讷河市|