起因
今天用Sqlyong客戶端在Tidb數(shù)據(jù)庫(兼容Mysql協(xié)議)里面查詢一些數(shù)據(jù),本來想通過時(shí)間字段看看數(shù)據(jù)產(chǎn)生的時(shí)間,結(jié)果發(fā)現(xiàn)即便是剛創(chuàng)建的數(shù)據(jù)時(shí)間字段也和我當(dāng)前的時(shí)間對不上狭郑,差了13個(gè)小時(shí)腰鬼。
調(diào)查
太奇怪了刻像,于是google了一下資料粟瞬,原來如果沒有自定義設(shè)置,數(shù)據(jù)庫默認(rèn)使用的時(shí)區(qū)是系統(tǒng)時(shí)區(qū)混巧,而系統(tǒng)時(shí)區(qū)為CST枪向,這個(gè)CST又有好多種解釋,分別為如下牲剃。
- 美國中部時(shí)間 Central Standard Time (USA) UTC-06:00
- 澳大利亞中部時(shí)間 Central Standard Time (Australia) UTC+09:30
- 中國標(biāo)準(zhǔn)時(shí) China Standard Time UTC+08:00
- 古巴標(biāo)準(zhǔn)時(shí) Cuba Standard Time UTC-04:00
當(dāng)JDBC與Mysql服務(wù)器建立連接時(shí)遣疯,如果我們沒有給JDBC指定時(shí)區(qū),JDBC就會取Mysql服務(wù)器的默認(rèn)時(shí)區(qū),也就是CST缠犀,而它又把CST理解成了美國中部時(shí)間数苫,結(jié)果就使用了美國中部時(shí)間的時(shí)區(qū),而不是后端系統(tǒng)服務(wù)器的時(shí)區(qū)辨液。
解決辦法
- 設(shè)置Tidb服務(wù)器的時(shí)區(qū)為我們想要的時(shí)區(qū)虐急,比如UTC+00,或者UTC+08;
- 重新配置后端系統(tǒng)連接數(shù)據(jù)庫服務(wù)器的URL滔迈,添加參數(shù)serverTimezone=UTC止吁;
總結(jié)
在和數(shù)據(jù)庫打交道的時(shí)候一定要注意時(shí)區(qū)問題,尤其是針對涉及國際化的業(yè)務(wù)來說燎悍,各個(gè)服務(wù)器的時(shí)區(qū)可能有很大差異敬惦,如果不顯示的指定統(tǒng)一的時(shí)區(qū),很容易導(dǎo)致混亂谈山。