MySQL Server時區支持

本文介紹MySQL維護的時區設置——如何加載命名時間支持所需的系統表,如何及時了解時區變化,以及如何啟用閏秒支持。

從MySQL 8.0.19開始,插入的日期時間值也支持時區偏移。

1?時區變量

MySQL Server維護了幾個時區設置:

  • 服務器系統時區。當服務器啟動時,它會嘗試確定主機的時區,并使用它來設置system_time_zone系統變量。
  • 要在啟動時明確指定MySQL Server的系統時區,請在啟動mysqld之前設置TZ環境變量。如果使用mysqld_safe啟動服務器,其--timezone選項提供了另一種設置系統時區的方法。TZ和--時區的允許值取決于系統。請參閱您的操作系統文檔,了解哪些值是可接受的。
  • 服務器當前時區。全局time_zone系統變量表示服務器當前運行的時區。初始time_zone值為“system”,表示服務器時區與系統時區相同。

注意:
如果設置為SYSTEM,則每個需要時區計算的MySQL函數調用都會進行系統庫調用,以確定當前系統時區。此調用可能受到全局互斥的保護,從而導致爭用。

初始全局服務器時區值可以在啟動時使用命令行上的--default時區選項顯式指定,也可以在選項文件中使用以下行:

default-time-zone='timezone'

如果您具有SYSTEM_VARIABLES_ADMIN權限(或不推薦使用的SUPER權限),則可以使用以下語句在運行時設置全局服務器時區值:

SET GLOBAL time_zone = timezone;
  • 每個會話的時區。每個連接的客戶端都有自己的會話時區設置,由會話time_zone變量給定。最初,會話變量的值取自全局time_zone變量,但客戶端可以使用以下語句更改自己的時區:
SET time_zone = timezone;

會話時區設置會影響區分區域的時間值的顯示和存儲。這包括函數(如NOW()或CURTIME())顯示的值,以及存儲在TIMESTAMP列中和從中檢索的值。TIMESTAMP列的值從會話時區轉換為UTC用于存儲,從UTC轉換為會話時區用于檢索。

會話時區設置不影響UTC_TIMESTAMP()等函數顯示的值或DATE、time或DATETIME列中的值。這些數據類型中的值也不存儲在UTC中;時區僅在從TIMESTAMP值轉換時適用于它們。如果需要DATE、TIME或DATETIME值的特定于區域設置的算術運算,請將它們轉換為UTC,執行算術運算,然后再轉換回來。

當前全局和會話時區值可以這樣檢索:

SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;

時區值可以用幾種格式給出,它們都不區分大小寫:

  1. 作為值“SYSTEM”,表示服務器時區與系統時區相同。
  2. 作為一個字符串,指示與UTC的偏移量,格式為[H]H:MM,前綴為+或-,如“+10:00”、“-6:00”或“+05:30”。前導零可以可選地用于小于10的小時值;在這種情況下,MySQL在存儲和檢索值時會預加一個前導零。MySQL將“-00:00”或“-0:00”轉換為“+00:00”。
  3. 在MySQL 8.0.19之前,此值必須在“-12:59”到“+13:00”之間(包括在內);從MySQL 8.0.19開始,允許的范圍是“-13:59”到“+14:00”,包括在內。
  4. 作為命名時區,如“歐洲/赫爾辛基”、“美國/東方”、“MET”或“UTC”。

只有當mysql數據庫中的時區信息表已經創建并填充時,才能使用命名時區。否則,使用命名時區會導致錯誤:

mysql> SET time_zone = 'UTC';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'UTC'

2 填充時區表

mysql系統模式中有幾個表用于存儲時區信息。MySQL安裝過程會創建時區表,但不會加載它們。要手動執行此操作,請使用以下說明。

注意:
加載時區信息不一定是一次性操作,因為信息偶爾會發生變化。當發生此類更改時,使用舊規則的應用程序將過期,您可能會發現有必要重新加載時區表,以保持MySQL服務器使用的信息是最新的。請參閱保持時區更改的最新狀態。

如果您的系統有自己的zoneinfo數據庫(描述時區的一組文件),請使用mysql_tzinfo_to_sql程序加載時區表。這類系統的例子有Linux、macOS、FreeBSD和Solaris。這些文件的一個可能位置是/usr/share/zoneinfo目錄。如果您的系統沒有zoneinfo數據庫,您可以使用可下載的軟件包。

要從命令行加載時區表,請將zoneinfo目錄路徑名傳遞給mysql_tzinfo_To_sql,并將輸出發送到mysql程序中。例如:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

這里顯示的mysql命令假設您使用root等帳戶連接到服務器,該帳戶具有修改mysql系統模式中的表的權限。根據需要調整連接參數。

mysql_tzinfo_to_sql讀取系統的時區文件并從中生成sql語句。mysql處理這些語句以加載時區表。

mysql_tzinfo_to_sql還可以用于加載單個時區文件或生成閏秒信息:

  • 要加載與時區名稱tz_name對應的單個時區文件tz_file,請調用mysql_tzinfo_To_sql,如下所示:
mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql

使用這種方法,必須執行一個單獨的命令來加載服務器需要了解的每個命名區域的時區文件。

  • 如果您的時區必須考慮閏秒,請初始化閏秒信息,如下所示,其中tz_file是時區文件的名稱:
mysql_tzinfo_to_sql --leap tz_file | mysql -u root -p mysql

在運行mysql_tzinfo_to_sql之后,重新啟動服務器,使其不再繼續使用任何以前緩存的時區數據。

如果您的系統沒有zoneinfo數據庫(例如,Windows),您可以使用一個包含SQL語句的包,該包可在MySQL開發區下載:

https://dev.mysql.com/downloads/timezones.html

注意:

如果您的系統有zoneinfo數據庫,請不要使用可下載的時區包。請改用mysql_tzinfo_to_sql實用程序。否則,您可能會導致MySQL和系統上其他應用程序在日期時間處理方面存在差異。

要使用已下載的SQL語句時區包,請對其進行解壓縮,然后將解壓縮后的文件內容加載到時區表中:

mysql -u root -p mysql < file_name

然后重新啟動服務器。

警告:
不要使用包含MyISAM表的可下載時區包。這適用于較舊的MySQL版本。MySQL現在使用InnoDB作為時區表。嘗試用MyISAM表替換它們會導致問題。

3 隨時了解時區變化

當時區規則更改時,使用舊規則的應用程序將過期。要保持最新,必須確保您的系統使用當前時區信息。對于MySQL,保持最新狀態需要考慮多個因素:

  • 如果MySQL服務器的時區設置為system,則操作系統時間會影響其使用的時間值。請確保您的操作系統使用的是最新的時區信息。對于大多數操作系統,最新的更新或service pack會為系統的時間變化做好準備。請查看操作系統供應商的網站,以獲取解決時間更改的更新。
  • 如果將系統的/etc/localtime zone文件替換為使用與mysqld啟動時有效的規則不同的規則的版本,請重新啟動mysqld,使其使用更新的規則。否則,當系統更改時間時,mysqld可能不會注意到。
  • 如果您在MySQL中使用命名時區,請確保MySQL數據庫中的時區表是最新的:
  1. 如果您的系統有自己的zoneinfo數據庫,請在更新zoneinfo時重新加載MySQL時區表。
  2. 對于沒有自己的zoneinfo數據庫的系統,請查看MySQL開發區以獲取更新。當有新的更新可用時,請下載并使用它來替換當前時區表的內容。

mysqld緩存它查找的時區信息,因此在更新時區表后,重新啟動mysqld以確保它不會繼續提供過時的時區數據。

如果您不確定命名時區是否可用(用作服務器的時區設置或由設置自己時區的客戶端使用),請檢查時區表是否為空。以下查詢確定包含時區名稱的表是否有任何行:

mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+

計數為零表示表為空。在這種情況下,當前沒有任何應用程序使用命名時區,因此不需要更新表(除非您希望啟用命名時區支持)。計數大于零表示該表不是空的,并且其內容可用于命名時區支持。在這種情況下,請確保重新加載時區表,以便使用命名時區的應用程序能夠獲得正確的查詢結果。

要檢查MySQL安裝是否已針對夏令時規則的更改進行了正確更新,請使用以下測試。此示例使用的值適用于美國3月11日凌晨2點發生的2007夏令時1小時變化。

測試使用以下查詢:

SELECTCONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') AS time1,CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') AS time2;

這兩個時間值表示夏令時更改發生的時間,使用命名時區需要使用時區表。所需的結果是,兩個查詢都返回相同的結果(輸入時間,轉換為“美國/中部”時區中的等效值)。

在更新時區表之前,您會看到如下錯誤結果:

+---------------------+---------------------+
| time1               | time2               |
+---------------------+---------------------+
| 2007-03-11 01:00:00 | 2007-03-11 02:00:00 |
+---------------------+---------------------+

更新表格后,您應該會看到正確的結果:

+---------------------+---------------------+
| time1               | time2               |
+---------------------+---------------------+
| 2007-03-11 01:00:00 | 2007-03-11 01:00:00 |
+---------------------+---------------------+

4 時區閏秒支持

閏秒值返回的時間部分以:59:59結束。這意味著像NOW()這樣的函數可以在閏秒期間連續兩三秒返回相同的值。確實,時間部分以:59:60或:59:61結尾的文字時間值被視為無效。

如果有必要在閏秒前一秒搜索TIMESTAMP值,如果將其與“YYYY-MM-DD hh:MM:ss”值進行比較,則可能會獲得異常結果。下面的示例演示了這一點。它將會話時區更改為UTC,因此內部TIMESTAMP值(以UTC為單位)和顯示值(已應用時區校正)之間沒有差異。

mysql> CREATE TABLE t1 (a INT,ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (ts));
Query OK, 0 rows affected (0.01 sec)mysql> -- change to UTC
mysql> SET time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)mysql> -- Simulate NOW() = '2008-12-31 23:59:59'
mysql> SET timestamp = 1230767999;
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t1 (a) VALUES (1);
Query OK, 1 row affected (0.00 sec)mysql> -- Simulate NOW() = '2008-12-31 23:59:60'
mysql> SET timestamp = 1230768000;
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t1 (a) VALUES (2);
Query OK, 1 row affected (0.00 sec)mysql> -- values differ internally but display the same
mysql> SELECT a, ts, UNIX_TIMESTAMP(ts) FROM t1;
+------+---------------------+--------------------+
| a    | ts                  | UNIX_TIMESTAMP(ts) |
+------+---------------------+--------------------+
|    1 | 2008-12-31 23:59:59 |         1230767999 |
|    2 | 2008-12-31 23:59:59 |         1230768000 |
+------+---------------------+--------------------+
2 rows in set (0.00 sec)mysql> -- only the non-leap value matches
mysql> SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:59';
+------+---------------------+
| a    | ts                  |
+------+---------------------+
|    1 | 2008-12-31 23:59:59 |
+------+---------------------+
1 row in set (0.00 sec)mysql> -- the leap value with seconds=60 is invalid
mysql> SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:60';
Empty set, 2 warnings (0.00 sec)

要解決此問題,您可以使用基于實際存儲在列中的UTC值的比較,該值已應用閏秒校正:

mysql> -- selecting using UNIX_TIMESTAMP value return leap value
mysql> SELECT * FROM t1 WHERE UNIX_TIMESTAMP(ts) = 1230768000;
+------+---------------------+
| a    | ts                  |
+------+---------------------+
|    2 | 2008-12-31 23:59:59 |
+------+---------------------+
1 row in set (0.00 sec)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39590.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

爬蟲筆記20——票星球搶票腳本的實現

以下內容僅供交流學習使用&#xff01;&#xff01;&#xff01; 思路分析 前面的爬蟲筆記一步一步走過來我們的技術水平也有了較大的提升了&#xff0c;現在我們來進行一下票星球搶票實戰項目&#xff0c;實現票星球的自動搶票。 我們打開票星球的移動端頁面&#xff0c;分…

視頻字幕提取在線工具有哪些?總結5個字幕提取工具

平時在沉浸式追劇的時候&#xff0c;我們常常都會被影視劇中的各種金句爆梗而逗得開懷大笑~而真正要用到時候卻總是一片頭腦空白。其實要記住它們最好的辦法便是將其提取留檔下來&#xff0c;每次有需要的時候打開就能一下子回顧到~ 今天就來帶大家盤一盤視頻字幕提取的軟件好…

高考假期預習指南

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

目標檢測YOLO實戰應用案例100講-基于深度學習的無人機影像小目標識別

目錄 前言 研究現狀 深度學習研究現狀 目標檢測研究現狀 目標檢測存在的問題 2 基于深度學習的目標檢測算法理論基礎 2.1 卷積神經網絡 2.1.1 卷積層 2.1.2 池化層 2.1.3 激活函數 2.1.4 全連接層 2.2 優化器 2.3 基于深度學習的目標檢測算法 2.3.1 …

樹上差分的公式推導

今天寫了一道題目&#xff0c;需要采用線段樹合并樹上差分來解決 題目鏈接&#xff1a;P1600 [NOIP2016 提高組] 天天愛跑步 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 其實當時已經想到要用這兩種方法&#xff0c;但苦于一直找不到轉移方程&#xff0c;最后看了答案才領…

java中可變參數

在Java中&#xff0c;... 是可變參數&#xff08;varargs&#xff09;的語法&#xff0c;用于允許一個方法接受可變數量的參數。可變參數的引入使得方法調用更加靈活和簡潔。以下是對可變參數的詳細解釋和使用示例。 可變參數的定義和使用 定義&#xff1a; 在方法參數列表中…

22-Pandas日期時間格式化

Pandas日期時間格式化 當進行數據分析時&#xff0c;我們會遇到很多帶有日期、時間格式的數據集&#xff0c;在處理這些數據集時&#xff0c;可能會遇到日期格式不統一的問題&#xff0c;此時就需要對日期時間做統一的格式化處理。比如“Wednesday, June 6, 2020”可以寫成“6…

Rust: polars行遍歷,從dataframe到struct及Bar設計比較

pandas提供了iterrows()、itertuples()、apply等行遍歷的方式&#xff0c;還是比較方便的。 polars的列操作功能非常強大&#xff0c;這個在其官網上有詳細的介紹。由于polars底層的arrow是列存儲模式&#xff0c;行操作效率低下&#xff0c;官方也不推薦以行方式進行數據操作。…

react_后臺管理_項目

目錄 1.運行項目 2. 項目結構 ①項目頂部導航欄 ②項目左側導航欄 ③主頁面-路由切換區 本項目使用的是 reacttsscss 技術棧。 1.運行項目 在當前頁面頂部下載本項目&#xff0c;解壓后使用編輯器打開&#xff0c;然后再終端輸入命令&#xff1a; npm i 下載依賴后&am…

【應急響應】Windows應急響應 - 基礎命令篇

前言 在如今的數字化時代&#xff0c;Windows系統面對著越來越復雜的網絡威脅和安全挑戰。本文將深入探討在Windows環境下的實戰應急響應策略。我們將重點關注實際應急響應流程、關鍵工具的應用&#xff0c;以及如何快速準確地識別和應對安全事件。通過分享實際案例分析&#…

FIO壓測磁盤性能以及需要注意的問題

一、壓測類型 1、順序讀&#xff08;IO&#xff09;&#xff1a;read&#xff0c;bs1M&#xff0c;job數從1開始往上加&#xff1a;2、3、4... 2、順序寫&#xff08;IO&#xff09;&#xff1a;write&#xff0c;bs1M&#xff0c;job數從1開始往上加&#xff1a;2、3、4... …

如何通過 1688 商品詳情的 API 接口獲取商品的詳細信息

在當今數字化商業的大背景下&#xff0c;能夠從 1688 這樣規模龐大且商品種類豐富的電商平臺中準確、高效地獲取商品的詳細信息&#xff0c;對于眾多企業和開發者而言&#xff0c;具有舉足輕重的意義。而通過 1688 商品詳情的 API 接口來實現這一目標&#xff0c;無疑是一種強大…

【ACM出版,馬來西亞-吉隆坡舉行】第四屆互聯網技術與教育信息化國際會議 (ITEI 2024)

作為全球科技創新大趨勢的引領者&#xff0c;中國不斷營造更加開放的科技創新環境&#xff0c;不斷提升學術合作的深度和廣度&#xff0c;構建惠及各方的創新共同體。這是對全球化的新貢獻&#xff0c;是構建人類命運共同體的新貢獻。 第四屆互聯網技術與教育信息化國際學術會議…

【 木蘭寬松許可證】

木蘭寬松許可證&#xff0c; 第1版 2019年8月 http://license.coscl.org.cn/MulanPSL 您對“軟件”的復制、使用、修改及分發受木蘭寬松許可證&#xff0c;第1版&#xff08;“本許可證”&#xff09;的如下條款的約束&#xff1a; 定義 “軟件”是指由“貢獻”構成的許可在“本…

【C++知識點總結全系列 (07)】:模板與泛型編程詳細總結與分析

模板與泛型編程 1、概述(1)What&#xff08;什么是模板、泛型編程&#xff09;(2)Why(3)Which(4)模板參數A.WhatB.HowC.模板參數的類型成員D.默認模板參數 2、模板函數3、模板類(1)How&#xff08;如何定義和使用模板類&#xff09;(2)成員模板 4、模板實參推斷(1)What&#xf…

入侵檢測模型

入侵檢測模型&#xff08;Intrusion Detection Model&#xff09;在網絡安全中起著至關重要的作用。它們用于識別和響應未經授權的訪問和攻擊行為。以下是常見的入侵檢測模型的詳細介紹&#xff1a; 一、入侵檢測模型分類 基于簽名的入侵檢測模型&#xff08;Signature-Based …

昇思25天學習打卡營第7天|Pix2Pix實現圖像轉換

文章目錄 昇思MindSpore應用實踐基于MindSpore的Pix2Pix圖像轉換1、Pix2Pix 概述2、U-Net架構定義UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判別器4、Pix2Pix的生成器和判別器初始化5、模型訓練6、模型推理 Reference 昇思MindSpore應用實踐 本系列文章主要…

大數據面試題之Flink(3)

如何確定Flink任務的合理并行度? Flink任務如何實現端到端一致? Flink如何處理背(反)壓? Flink解決數據延遲的問題 Flink消費kafka分區的數據時flink件務并行度之間的關系 使用flink-client消費kafka數據還是使用flink-connector消費 如何動態修改Flink的配置&a…

實戰:基于Java的大數據處理與分析平臺

實戰&#xff1a;基于Java的大數據處理與分析平臺 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何利用Java構建高效的大數據處理與分析平臺。…

Python基礎003

Python流程控制基礎 1.條件語句 內置函數input a input("請輸入一段內容&#xff1a;") print(a) print(type(a))代碼執行的時候遇到input函數&#xff0c;就會等鍵盤輸入結果&#xff0c;已回車為結束標志&#xff0c;也就時說輸入回車后代碼才會執行 2.順序執行…