日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

關于Java中的mysql時區問題詳解

瀏覽:134日期:2022-09-01 10:42:01

前言

話說工作十多年,mysql 還真沒用幾年。起初是外企銀行,無法直接接觸到 DB;后來一直從事架構方面,也多是解決問題為主。

這次搭建海外機房,圍繞時區大家做了一番討論。不說最終的結果是什么,期間有同事認為 DB 返回的是 UTC 時間。

這里簡單做個驗證,順便看下時區的問題到底是如何處理。

環境

openjdk version “1.8.0_242”mysql-connector-java “8.0.20”mysql “5.7” 時區 TZ=Europe/London

本地時區 GMT+8

創建個簡單的庫test及表user, 表結構如下:

CREATE TABLE `user` ( `name` varchar(50) NOT NULL, `birth_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=latin1

插入一條測試數據:

mysql> insert into `user` -> values (’Tom’, time(’2020-05-15 08:00:00’));Query OK, 1 row affected (0.01 sec)mysql> select * from user;+------+---------------------+| name | birth_date |+------+---------------------+| Tom | 2020-05-14 08:00:00 |+------+---------------------+1 row in set (0.00 sec)

測試代碼:

Connection conn = DriverManager.getConnection('jdbc:mysql://localhost:3306/test?useSSL=false', 'root', 'root');Statement stmt = conn.createStatement();stmt.execute('select * from user where name = ’Tom’');ResultSet rs = stmt.getResultSet();while (rs.next()) { Timestamp timestamp = rs.getTimestamp('birth_date'); System.out.println(timestamp.toLocalDateTime().toString());}

執行結果:

2020-05-14T15:00

分析

程序的執行過程同時用 wireshark 抓了包。可以看到一次查詢,做了這么多次的交互(包含了會話初始化)。這里可以看到 #177 的交互返回查詢的結果:Tom 2020-05-14 08:00:00,與 DB 中的數據相符。可見,返回的并不是 UTC 時間。

關于Java中的mysql時區問題詳解

在 TCP 抓包結果中 #155 的查詢語句:

/* mysql-connector-java-8.0.20 (Revision: afc0a13cd3c5a0bf57eaa809ee0ee6df1fd5ac9b) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packetAS max_allowed_packet, @@net_write_timeoutAS net_write_timeout, @@performance_schemaAS performance_schema, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@transaction_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout;

關于Java中的mysql時區問題詳解

服務端返回的 time_zone 為 BST。與本地時區的轉換,由 mysql 的 connector 自動完成。

進階

時區自動轉換

實現源碼:

ResultSetImpl源碼

this.defaultTimestampValueFactory = new SqlTimestampValueFactory(pset, null, this.session.getServerSession().getServerTimeZone());@Overridepublic Timestamp getTimestamp(int columnIndex) throws SQLException { checkRowPos(); checkColumnBounds(columnIndex); return this.thisRow.getValue(columnIndex - 1, this.defaultTimestampValueFactory);}

如何確認服務端時區?

使用會話中的服務端時區進行服務端時區。會話初始化時會進行時區的確認,比如前面獲取的到BST。確認時區的邏輯在NativeProtocol#configureTimezone()中:

public void configureTimezone() { #從mysql的響應獲取 time_zone 和 system_time_zone 的設置 String configuredTimeZoneOnServer = this.serverSession.getServerVariable('time_zone'); if ('SYSTEM'.equalsIgnoreCase(configuredTimeZoneOnServer)) { configuredTimeZoneOnServer = this.serverSession.getServerVariable('system_time_zone'); } #從 jdbc url 參數 serverTimezone 獲取時區 String canonicalTimezone = getPropertySet().getStringProperty(PropertyKey.serverTimezone).getValue(); if (configuredTimeZoneOnServer != null) { //如果 jdbc url 中未通過 serverTimezone 指定時區。則從TimeZoneMapping.properties中獲取mysql 回傳的時區縮寫對應的標準時區,比如此處的 BST => Europe/London //會出現無法映射的情況,不如 CEST 無法映射到 => Europe/Berlin,可以指定自定義的 Properties 文件進行映射 // 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()); } } } //如果 jdbc url 中通過 serverTimezone 指定了時區,則優先使用該時區 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()); } }}

關于 serverTimezone 的官方說明

Override detection/mapping of time zone. Used when time zone from server doesn’t map to Java time zone

修改一下 jdbc url,通過serverTimezone指定時區為 GMT+8:jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false

再次執行代碼:

2020-05-14T08:00

總結

到此這篇關于關于Java中mysql時區問題的文章就介紹到這了,更多相關Java中mysql時區問題內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美亚洲激情| 日韩精品中文字幕第1页| 国产91精品对白在线播放| av最新在线| 久久精品国产成人一区二区三区| 国产三级一区| 欧美91在线| 久久午夜影院| 精品美女视频| 免费高潮视频95在线观看网站| 欧美精品资源| 不卡视频在线| 男人的天堂久久精品| 亚洲精品一区二区在线播放∴| 日本不卡一区二区| 日韩av二区在线播放| 国产精品theporn| 日本欧美国产| 一区在线免费观看| 美女精品一区| 日韩精品亚洲专区| 国产精品乱战久久久| 红杏一区二区三区| 久久免费黄色| 首页亚洲欧美制服丝腿| 亚洲精品一级二级三级| 国产精品密蕾丝视频下载| 精品日韩一区| 日韩在线免费| 国产一级久久| 亚洲三级精品| 欧美日韩 国产精品| 免费在线日韩av| 日韩在线免费| 久久午夜精品| 欧美黄色精品| 色吊丝一区二区| 亚洲免费一区三区| 国产999精品在线观看| 欧洲激情综合| 欧美一区影院| 久久久蜜桃一区二区人| 美国三级日本三级久久99| 麻豆一区在线| 亚洲成人日韩| 国产探花在线精品一区二区| 日韩av一级| 色婷婷成人网| 亚洲va中文在线播放免费| 欧美日韩国产亚洲一区| 国产情侣久久| 999久久久亚洲| 欧美视频二区| 亚洲福利免费| 久久av超碰| 午夜日本精品| 久久99视频| 日韩一级网站| 久久亚洲国产精品尤物| 99亚洲视频| 精品网站999| 三级亚洲高清视频| 四季av一区二区凹凸精品| 亚洲精品亚洲人成在线观看| 精品国产精品久久一区免费式| 怡红院精品视频在线观看极品| 麻豆精品视频在线观看免费| 水野朝阳av一区二区三区| 精品网站999| 美女日韩在线中文字幕| 国产成人精品三级高清久久91 | 日韩成人av影视| 久久影院一区| 精品日本视频| 日本不卡一二三区黄网| 99精品视频在线| 国产精品99久久免费| 久久国产66| 中文在线中文资源| 日本aⅴ亚洲精品中文乱码| 五月天综合网站| 激情黄产视频在线免费观看| 日韩av不卡一区二区| 伊人影院久久| 久久精品官网| 日韩av自拍| 青青在线精品| 人人精品人人爱| 99久久夜色精品国产亚洲狼 | 日本久久成人网| 欧美在线日韩| 亚洲黄色在线| 日韩av免费| 岛国av在线播放| 久久不见久久见免费视频7| 午夜性色一区二区三区免费视频| 美女久久久久| 成人自拍av| 国产成人精选| 欧美精品aa| 国产精品黄色片| 国产精品一在线观看| 日韩福利视频一区| 亚洲精品高潮| 中文字幕日韩高清在线| 国产亚洲精品v| 欧美一区三区| 欧美亚洲在线日韩| 91精品一区二区三区综合| 极品av在线| 国产网站在线| 成人小电影网站| 91亚洲人成网污www| 精品欠久久久中文字幕加勒比| 国产亚洲一区| 欧美色综合网| 国产日产高清欧美一区二区三区| 日本亚洲视频| 日韩av影院| 国产日韩欧美一区在线| 欧美日韩亚洲三区| 日本不卡视频在线观看| 日韩精品视频在线看| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 日本一区福利在线| 天堂va在线高清一区| 亚洲精品人人| 日韩激情中文字幕| 国产乱码精品| 麻豆成人91精品二区三区| 国产伦理久久久久久妇女| 国产麻豆一区二区三区精品视频| 国产精品免费不| 韩日一区二区| 狂野欧美性猛交xxxx| av资源中文在线天堂| 日韩精品麻豆| 欧美午夜不卡| 亚洲精品自拍| 国产美女撒尿一区二区| 国产精品2区| zzzwww在线看片免费| 欧美影院三区| 丝袜a∨在线一区二区三区不卡 | 国产欧美一区二区三区米奇| 美腿丝袜亚洲一区| 97精品国产一区二区三区| 日韩av有码| 蜜桃成人av| 蜜桃免费网站一区二区三区| 日韩高清成人在线| 精品视频网站| 91精品亚洲| 亚洲人www| 国产一区日韩| 91九色精品| 91亚洲无吗| 黄色在线网站噜噜噜| 99视频精品免费观看| 久久精品99国产精品日本| yellow在线观看网址| 夜夜嗨网站十八久久| 四虎国产精品免费久久| 久久亚洲精精品中文字幕| 国产91久久精品一区二区| 亚洲综合图色| 国际精品欧美精品| 亚洲深爱激情| 国产精品jk白丝蜜臀av小说| 99精品综合| 日韩av午夜在线观看| 日本在线高清| 天堂va在线高清一区| 日本美女一区| 日韩高清在线不卡| av中文资源在线资源免费观看| 亚洲一区黄色| 国产欧美日韩精品高清二区综合区 | 日韩av中文字幕一区二区三区| 国产成人免费| 亚洲人www| 亚洲va中文在线播放免费| 日韩中文字幕| 电影亚洲精品噜噜在线观看| 伊人精品久久| 精品久久久网| 日韩精品一级二级| 国产精品99久久免费| 亚洲成人免费| 精品视频97| 免费在线观看日韩欧美| 亚洲www免费| 成人台湾亚洲精品一区二区| 日韩福利视频网| 在线观看一区| 99视频一区| 99久久精品费精品国产| 日韩精品视频中文字幕| 精品欧美激情在线观看| 老司机精品在线|