寬表引擎2.7.6版本之前僅支持東八時區。 2.7.6版本之后,寬表引擎支持了跨時區特性。本文介紹如何設置當前連接的時區,以確保時間數據與您的期望一致。
背景信息
目前Lindorm支持三種時間類型,其中TIMESTAMP類型和時區相關,DATE、TIME類型和時區無關。
數據類型 | 說明 | 時區特性 |
DATE | 表示年月日,格式為 | 日期字符串,不涉及時區。 |
TIME | 表示時分秒,格式為 | 時間字符串,不涉及時區。 |
TIMESTAMP | 表示年月日時分秒毫秒。格式有以下兩種:
|
|
前提條件
寬表引擎為2.7.6及以上版本。如何查看或升級當前版本,請參見寬表引擎版本說明和升級小版本。
如果您的寬表引擎無法通過控制臺升級至2.7.6及以上版本,請聯系Lindorm技術支持(釘釘號:s0s3eg3)。
使用限制
僅MySQL協議支持設置連接時區。MySQL協議連接方式,請參見使用MySQL協議(推薦)。
設置時區
Lindorm默認時區為東八時區。
設置連接時區僅對當前連接生效。
您可以通過SET
語法設置當前連接的時區,僅對當前連接生效。SET
語法的詳細說明,請參見會話變量。
設置當前連接時區為UTC時區。
SET @@time_zone='UTC';
設置當前連接時區為+08:00時區。
SET @@time_zone='+08:00';
設置當前連接時區為上海時區(即上海的本地時間)。
SET @@time_zone='Asia/Shanghai';
查詢當前時區
SELECT @@time_zone;
示例
MySQL命令行
通過MySQL命令行連接寬表引擎,請參見通過MySQL命令行連接寬表引擎。
假設表tb
的結構、表中數據如下:
-- 創建表
CREATE TABLE tb(p1 int, c1 date, c2 time, c3 timestamp(3), PRIMARY KEY(p1));
-- 插入數據
UPSERT INTO tb(p1,c1,c2,c3) VALUES(1, '2024-08-30', '08:11:15', '2024-08-30 08:11:15.354');
您可以通過以下方式查看和修改連接時區。
查詢當前連接的時區。
SELECT @@time_zone;
返回結果:
+-------------+ | @@time_zone | +-------------+ | +08:00 | +-------------+
可以看到當前時區為東八區。
查看當前時區下的時間數據格式。
SELECT * FROM tb;
返回結果:
+------+------------+----------+-------------------------+ | p1 | c1 | c2 | c3 | +------+------------+----------+-------------------------+ | 1 | 2024-08-30 | 08:11:15 | 2024-08-30 08:11:15.354 | +------+------------+----------+-------------------------+
修改當前連接時區為UTC。
SET @@time_zone='UTC';
驗證是否修改成功。
SELECT @@time_zone;
返回結果:
+-------------+ | @@time_zone | +-------------+ | UTC | +-------------+
再次查看當前時區下的時間數據格式,驗證時區是否修改成功。
SELECT * FROM tb;
返回結果:
+------+------------+----------+-------------------------+ | p1 | c1 | c2 | c3 | +------+------------+----------+-------------------------+ | 1 | 2024-08-30 | 08:11:15 | 2024-08-30 00:11:15.354 | +------+------------+----------+-------------------------+
可以看到DATE和DATE類型的
c1
、c2
列由于與時區無關,因此數據格式無變化。TIMESTAMP類型的c3
列中的數據已變為UTC時區下的日期時間。
Java
Java JDBC連接方式,請參見基于Java JDBC接口的應用開發。
當業務運行在非東八區時,建議您在連接串中添加參數forceConnectionTimeZoneToSession=true
來設置連接時區。具體說明如下:
參數 | 示例值 | 說明 |
connectionTimeZone | UTC | 設置連接時區,默認為客戶端運行的JVM時區(運行Java程序的虛擬機所使用的默認時區)。如無特殊需要可以不設置。 |
forceConnectionTimeZoneToSession | true | 將connectionTimeZone的值通過 |
連接示例
String url = "jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/" + database + "?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000&forceConnectionTimeZoneToSession=true";
Properties properties = new Properties();
properties.put("user", username);
properties.put("password", password);
//獲取連接
Connection connection = DriverManager.getConnection(url, properties);
Python
通過mysql-connector-python驅動連接寬表引擎,請參見基于Python的應用開發(mysql-connector-python)。
如果業務運行在UTC時區下,需要在連接串中添加time_zone參數來修改連接時區,使用方式:time_zone='UTC'
。
參數 | 示例值 | 說明 |
time_zone |
| 建議設置為業務運行的系統時區。系統將會通過 |
連接示例:
connection = mysql.connector.connect(host='<MySQL兼容地址>', port=33060, user='<用戶名>', passwd='<密碼>', database='<數據庫名>', time_zone='<時區>')
Go
通過Golang MySQL Driver驅動連接寬表引擎,請參見基于Go的應用開發。
如果業務運行在UTC時區下,需要在連接串中添加loc=Locall&time_zone=%27UTC%27
。具體說明如下:
參數 | 示例值 | 說明 |
parseTime | true |
|
loc | Local | 設置解析 說明 僅設置了 |
time_zone | %27UTC%27 | 設置為業務運行的系統時區。 |
更多說明,請參見系統變量。
連接示例:
urlString := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s&parseTime=true&loc=Local", user, password, host, port, database, connectTimeout)
timeZoneValue := url.QueryEscape("'UTC'")
urlString = urlString + "&time_zone=" + timeZoneValue
db, err := sql.Open("mysql", urlString)
if err != nil {
panic(err.Error())
}