mysql 時區問題


1.問題源自何處?
之前用的mysql 8.0以上的版本連接時都需要在url后面加 serverTimezone=UTC

<property name="url" value="jdbc:mysql://localhost:3306/db2?serverTimezone=UTC" />
實際上是指出核數據庫的時區為美國。因為我們的數據庫的時區是美國的,而我們連接的時候用的是中國的北京時間,然后比美國早上8個小時,然后呢用的時候就必須指出我們當前用的時間是美國的時間,這樣才能連接上數據庫。

2.那么可不可以直接將數據庫的默認時區改到中國呢?

當然是可以的,如果是windows系統,在mysql解壓路徑下的 my.ini 文件的 [mysqld] 里面加上 default-time-zone=’+8:00’ ;
改了之后那么現在就可以直接用 “裸url了”。

<property name="url" value="jdbc:mysql://localhost:3306/db2" />
 
        

mysql 使用了UTC方式來記錄日志時間,也就是說這是個世界統一時間,存入mysql中的時間只能是UTC時間。mysql的timestamp類型數據,存儲的時候會轉化成UTC時間戳,讀取時再從UTC轉化為本地時間戳。各地的標准時間為格林威治時間(G.M.T)加上 (+) 或減去 (-) 時區中所標的小時和分鍾數時差。中國是GMT+8.

1.1 查看mysql當前時間,當前時區

> select curtime();   #或select now()也可以
+-----------+
| curtime() |
+-----------+
| 15:18:10  |
+-----------+
 
> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
#time_zone說明mysql使用system的時區,system_time_zone說明system使用CST時區

1.2 修改時區

set global time_zone = '+8:00'; ##修改mysql全局時區為北京時間,即我們所在的東8區
set time_zone = '+8:00'; ##修改當前會話時區
flush privileges; #立即生效

 

解決方法:

方法1、使用6.0以下版本的jdbc:降版本,並不推薦;

方法2、在jdbc url指定默認時區:

還有一種是在jdbc連接的url后面加上serverTimezone=UTC或GMT即可,如果指定使用gmt+8時區,需要寫成GMT%2B8,否則可能報解析為空的錯誤。示例如下:

jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&characterEncoding=utf-8 
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf-8  
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 

增加: 

serverTimezone=UTC 
serverTimezone=GMT%2B8

推薦使用如下:

serverTimezone=Asia/Shanghai

方法3、在數據庫配置中添加默認時區:

SQL語句配置全局時區

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)
 
#設置當前session時區,即時生效,但僅作用於當前session
mysql> set time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
 
#設置全局時區,即時生效,作用於所有session
mysql> set global time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)

或者通過修改my.cnf配置文件來修改時區:

# vim /etc/my.cnf  ##在[mysqld]區域中加上
default-time_zone = '+8:00' 
# /etc/init.d/mysqld restart  ##重啟mysql使新時區生效

我遇到的問題是:在數據庫中select now(); 返回的時間正常,但是jdbc查詢出的時間比實際時間要早8小時:

解決辦法是jdbc連接的url中配置的時區參數:&serverTimezone=GMT%2B8


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM