0.1 如何規(guī)避mysql的url時(shí)區(qū)的陷阱

在使用mysql的6.0.x以上的jar的時(shí)候,需要在代碼url的鏈接里面指定serverTimezone。就會(huì)出現(xiàn)異常

1.未指定serverTimezone

  • xml里面配置url
<property name="url" value="jdbc:mysql://localhost:3306/mybatisstudy"/>
  • 出現(xiàn)的異常
Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

您必須配置服務(wù)器或JDBC驅(qū)動(dòng)程序(通過(guò)serverTimezone配置屬性),如果您想要使用時(shí)區(qū)支持,則需要使用一個(gè)更詳細(xì)的時(shí)區(qū)值。

2.網(wǎng)上的解決方案

  • 在url后面加上參數(shù)?serverTimezone=utc
<property name="url" value="jdbc:mysql://localhost:3306/springdatastudy?serverTimezone=UTC"/>

2.1.遇到的問(wèn)題

雖然上面加上時(shí)區(qū)程序不出錯(cuò)了,但是我們?cè)谟胘ava代碼插入到數(shù)據(jù)庫(kù)時(shí)間的時(shí)候卻出現(xiàn)了問(wèn)題。

比如在java代碼里面插入的時(shí)間為:2017-08-21 17:29:56

但是在數(shù)據(jù)庫(kù)里面顯示的時(shí)間卻為:2017-08-21 09:29:56

3.根本原因

因?yàn)闀r(shí)區(qū)設(shè)置的問(wèn)題。

UTC代表的是全球標(biāo)準(zhǔn)時(shí)間 ,但是我們使用的時(shí)間是北京時(shí)區(qū)也就是東八區(qū),領(lǐng)先UTC八個(gè)小時(shí)。

UTC + (+0800) = 本地(北京)時(shí)間

4.解決方案

url的時(shí)區(qū)使用中國(guó)標(biāo)準(zhǔn)時(shí)間。也是就serverTimezone=Asia/Shanghai

4.1 使用java代碼獲取本地的時(shí)區(qū)id

Calendar cal = Calendar.getInstance();
TimeZone timeZone = cal.getTimeZone();
System.out.println(timeZone.getID());
System.out.println(timeZone.getDisplayName());
Asia/Shanghai
中國(guó)標(biāo)準(zhǔn)時(shí)間

5.中文亂碼的解決方案

url鏈接后面加上編碼字符 characterEncoding=utf8

jdbc.url=jdbc:mysql://localhost:3306/cnblogs?serverTimezone=Asia/Shanghai&characterEncoding=utf8
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容