最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL Server時(shí)區(qū)支持的使用

 更新時(shí)間:2024年07月29日 09:57:57   作者:icysmile131  
MySQL Server維護(hù)了幾個(gè)時(shí)區(qū),本文主要介紹了MySQL Server時(shí)區(qū)支持的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文介紹MySQL維護(hù)的時(shí)區(qū)設(shè)置——如何加載命名時(shí)間支持所需的系統(tǒng)表,如何及時(shí)了解時(shí)區(qū)變化,以及如何啟用閏秒支持。

從MySQL 8.0.19開始,插入的日期時(shí)間值也支持時(shí)區(qū)偏移。

1 時(shí)區(qū)變量

MySQL Server維護(hù)了幾個(gè)時(shí)區(qū)設(shè)置:

  • 服務(wù)器系統(tǒng)時(shí)區(qū)。當(dāng)服務(wù)器啟動(dòng)時(shí),它會(huì)嘗試確定主機(jī)的時(shí)區(qū),并使用它來設(shè)置system_time_zone系統(tǒng)變量。
  • 要在啟動(dòng)時(shí)明確指定MySQL Server的系統(tǒng)時(shí)區(qū),請(qǐng)?jiān)趩?dòng)mysqld之前設(shè)置TZ環(huán)境變量。如果使用mysqld_safe啟動(dòng)服務(wù)器,其--timezone選項(xiàng)提供了另一種設(shè)置系統(tǒng)時(shí)區(qū)的方法。TZ和--時(shí)區(qū)的允許值取決于系統(tǒng)。請(qǐng)參閱您的操作系統(tǒng)文檔,了解哪些值是可接受的。
  • 服務(wù)器當(dāng)前時(shí)區(qū)。全局time_zone系統(tǒng)變量表示服務(wù)器當(dāng)前運(yùn)行的時(shí)區(qū)。初始time_zone值為“system”,表示服務(wù)器時(shí)區(qū)與系統(tǒng)時(shí)區(qū)相同。

注意:
如果設(shè)置為SYSTEM,則每個(gè)需要時(shí)區(qū)計(jì)算的MySQL函數(shù)調(diào)用都會(huì)進(jìn)行系統(tǒng)庫調(diào)用,以確定當(dāng)前系統(tǒng)時(shí)區(qū)。此調(diào)用可能受到全局互斥的保護(hù),從而導(dǎo)致爭(zhēng)用。

初始全局服務(wù)器時(shí)區(qū)值可以在啟動(dòng)時(shí)使用命令行上的--default時(shí)區(qū)選項(xiàng)顯式指定,也可以在選項(xiàng)文件中使用以下行:

default-time-zone='timezone'

如果您具有SYSTEM_VARIABLES_ADMIN權(quán)限(或不推薦使用的SUPER權(quán)限),則可以使用以下語句在運(yùn)行時(shí)設(shè)置全局服務(wù)器時(shí)區(qū)值:

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

會(huì)話時(shí)區(qū)設(shè)置會(huì)影響區(qū)分區(qū)域的時(shí)間值的顯示和存儲(chǔ)。這包括函數(shù)(如NOW()或CURTIME())顯示的值,以及存儲(chǔ)在TIMESTAMP列中和從中檢索的值。TIMESTAMP列的值從會(huì)話時(shí)區(qū)轉(zhuǎn)換為UTC用于存儲(chǔ),從UTC轉(zhuǎn)換為會(huì)話時(shí)區(qū)用于檢索。

會(huì)話時(shí)區(qū)設(shè)置不影響UTC_TIMESTAMP()等函數(shù)顯示的值或DATE、time或DATETIME列中的值。這些數(shù)據(jù)類型中的值也不存儲(chǔ)在UTC中;時(shí)區(qū)僅在從TIMESTAMP值轉(zhuǎn)換時(shí)適用于它們。如果需要DATE、TIME或DATETIME值的特定于區(qū)域設(shè)置的算術(shù)運(yùn)算,請(qǐng)將它們轉(zhuǎn)換為UTC,執(zhí)行算術(shù)運(yùn)算,然后再轉(zhuǎn)換回來。

當(dāng)前全局和會(huì)話時(shí)區(qū)值可以這樣檢索:

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

時(shí)區(qū)值可以用幾種格式給出,它們都不區(qū)分大小寫:

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

只有當(dāng)mysql數(shù)據(jù)庫中的時(shí)區(qū)信息表已經(jīng)創(chuàng)建并填充時(shí),才能使用命名時(shí)區(qū)。否則,使用命名時(shí)區(qū)會(huì)導(dǎo)致錯(cuò)誤:

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

2 填充時(shí)區(qū)表

mysql系統(tǒng)模式中有幾個(gè)表用于存儲(chǔ)時(shí)區(qū)信息。MySQL安裝過程會(huì)創(chuàng)建時(shí)區(qū)表,但不會(huì)加載它們。要手動(dòng)執(zhí)行此操作,請(qǐng)使用以下說明。

注意:
加載時(shí)區(qū)信息不一定是一次性操作,因?yàn)樾畔⑴紶枙?huì)發(fā)生變化。當(dāng)發(fā)生此類更改時(shí),使用舊規(guī)則的應(yīng)用程序?qū)⑦^期,您可能會(huì)發(fā)現(xiàn)有必要重新加載時(shí)區(qū)表,以保持MySQL服務(wù)器使用的信息是最新的。請(qǐng)參閱保持時(shí)區(qū)更改的最新狀態(tài)。

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

要從命令行加載時(shí)區(qū)表,請(qǐng)將zoneinfo目錄路徑名傳遞給mysql_tzinfo_To_sql,并將輸出發(fā)送到mysql程序中。例如:

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

這里顯示的mysql命令假設(shè)您使用root等帳戶連接到服務(wù)器,該帳戶具有修改mysql系統(tǒng)模式中的表的權(quán)限。根據(jù)需要調(diào)整連接參數(shù)。

mysql_tzinfo_to_sql讀取系統(tǒng)的時(shí)區(qū)文件并從中生成sql語句。mysql處理這些語句以加載時(shí)區(qū)表。

mysql_tzinfo_to_sql還可以用于加載單個(gè)時(shí)區(qū)文件或生成閏秒信息:

  • 要加載與時(shí)區(qū)名稱tz_name對(duì)應(yīng)的單個(gè)時(shí)區(qū)文件tz_file,請(qǐng)調(diào)用mysql_tzinfo_To_sql,如下所示:
mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql

使用這種方法,必須執(zhí)行一個(gè)單獨(dú)的命令來加載服務(wù)器需要了解的每個(gè)命名區(qū)域的時(shí)區(qū)文件。

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

在運(yùn)行mysql_tzinfo_to_sql之后,重新啟動(dòng)服務(wù)器,使其不再繼續(xù)使用任何以前緩存的時(shí)區(qū)數(shù)據(jù)。

如果您的系統(tǒng)沒有zoneinfo數(shù)據(jù)庫(例如,Windows),您可以使用一個(gè)包含SQL語句的包,該包可在MySQL開發(fā)區(qū)下載:

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

注意:

如果您的系統(tǒng)有zoneinfo數(shù)據(jù)庫,請(qǐng)不要使用可下載的時(shí)區(qū)包。請(qǐng)改用mysql_tzinfo_to_sql實(shí)用程序。否則,您可能會(huì)導(dǎo)致MySQL和系統(tǒng)上其他應(yīng)用程序在日期時(shí)間處理方面存在差異。

要使用已下載的SQL語句時(shí)區(qū)包,請(qǐng)對(duì)其進(jìn)行解壓縮,然后將解壓縮后的文件內(nèi)容加載到時(shí)區(qū)表中:

mysql -u root -p mysql < file_name

然后重新啟動(dòng)服務(wù)器。

警告:
不要使用包含MyISAM表的可下載時(shí)區(qū)包。這適用于較舊的MySQL版本。MySQL現(xiàn)在使用InnoDB作為時(shí)區(qū)表。嘗試用MyISAM表替換它們會(huì)導(dǎo)致問題。

3 隨時(shí)了解時(shí)區(qū)變化

當(dāng)時(shí)區(qū)規(guī)則更改時(shí),使用舊規(guī)則的應(yīng)用程序?qū)⑦^期。要保持最新,必須確保您的系統(tǒng)使用當(dāng)前時(shí)區(qū)信息。對(duì)于MySQL,保持最新狀態(tài)需要考慮多個(gè)因素:

  • 如果MySQL服務(wù)器的時(shí)區(qū)設(shè)置為system,則操作系統(tǒng)時(shí)間會(huì)影響其使用的時(shí)間值。請(qǐng)確保您的操作系統(tǒng)使用的是最新的時(shí)區(qū)信息。對(duì)于大多數(shù)操作系統(tǒng),最新的更新或service pack會(huì)為系統(tǒng)的時(shí)間變化做好準(zhǔn)備。請(qǐng)查看操作系統(tǒng)供應(yīng)商的網(wǎng)站,以獲取解決時(shí)間更改的更新。
  • 如果將系統(tǒng)的/etc/localtime zone文件替換為使用與mysqld啟動(dòng)時(shí)有效的規(guī)則不同的規(guī)則的版本,請(qǐng)重新啟動(dòng)mysqld,使其使用更新的規(guī)則。否則,當(dāng)系統(tǒng)更改時(shí)間時(shí),mysqld可能不會(huì)注意到。
  • 如果您在MySQL中使用命名時(shí)區(qū),請(qǐng)確保MySQL數(shù)據(jù)庫中的時(shí)區(qū)表是最新的:
  • 如果您的系統(tǒng)有自己的zoneinfo數(shù)據(jù)庫,請(qǐng)?jiān)诟聑oneinfo時(shí)重新加載MySQL時(shí)區(qū)表。
  • 對(duì)于沒有自己的zoneinfo數(shù)據(jù)庫的系統(tǒng),請(qǐng)查看MySQL開發(fā)區(qū)以獲取更新。當(dāng)有新的更新可用時(shí),請(qǐng)下載并使用它來替換當(dāng)前時(shí)區(qū)表的內(nèi)容。

mysqld緩存它查找的時(shí)區(qū)信息,因此在更新時(shí)區(qū)表后,重新啟動(dòng)mysqld以確保它不會(huì)繼續(xù)提供過時(shí)的時(shí)區(qū)數(shù)據(jù)。

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

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

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

要檢查MySQL安裝是否已針對(duì)夏令時(shí)規(guī)則的更改進(jìn)行了正確更新,請(qǐng)使用以下測(cè)試。此示例使用的值適用于美國3月11日凌晨2點(diǎn)發(fā)生的2007夏令時(shí)1小時(shí)變化。

測(cè)試使用以下查詢:

SELECT
  CONVERT_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;

這兩個(gè)時(shí)間值表示夏令時(shí)更改發(fā)生的時(shí)間,使用命名時(shí)區(qū)需要使用時(shí)區(qū)表。所需的結(jié)果是,兩個(gè)查詢都返回相同的結(jié)果(輸入時(shí)間,轉(zhuǎn)換為“美國/中部”時(shí)區(qū)中的等效值)。

在更新時(shí)區(qū)表之前,您會(huì)看到如下錯(cuò)誤結(jié)果:

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

更新表格后,您應(yīng)該會(huì)看到正確的結(jié)果:

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

4 時(shí)區(qū)閏秒支持

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

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

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)

要解決此問題,您可以使用基于實(shí)際存儲(chǔ)在列中的UTC值的比較,該值已應(yīng)用閏秒校正:

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)

到此這篇關(guān)于MySQL Server時(shí)區(qū)支持的使用的文章就介紹到這了,更多相關(guān)MySQL Server時(shí)區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • ubuntu linux下使用Qt連接MySQL數(shù)據(jù)庫的方法

    ubuntu linux下使用Qt連接MySQL數(shù)據(jù)庫的方法

    Linux下完整的MySQL開發(fā)需要安裝服務(wù)器端,如果安裝客戶端也沒什么不好。直接在軟件中心搜mysql,把client和server選上。
    2011-08-08
  • MySQL 聚合查詢 和 分組查詢示例詳解

    MySQL 聚合查詢 和 分組查詢示例詳解

    聚合查詢是SQL中對(duì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)的操作,可以將多行數(shù)據(jù)按照特定條件合并計(jì)算,返回匯總結(jié)果,本文通過實(shí)例代碼講解MySQL聚合查詢和 分組查詢,感興趣的朋友一起看看吧
    2025-04-04
  • MySQL索引的一些常見面試題大全(2022年)

    MySQL索引的一些常見面試題大全(2022年)

    索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),是對(duì)表中一列或多列值進(jìn)行排序的結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于MySQL索引的一些常見面試題,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • MySQL多表鏈接查詢核心優(yōu)化

    MySQL多表鏈接查詢核心優(yōu)化

    本篇文章主要介紹了MySQL多表鏈接查詢核心優(yōu)化,數(shù)據(jù)庫對(duì)數(shù)據(jù)表的多表查詢是必不可少的,所以涉及到性能優(yōu)化,有需要的可以了解一下。
    2016-11-11
  • MYSQL SET類型字段的SQL操作知識(shí)介紹

    MYSQL SET類型字段的SQL操作知識(shí)介紹

    本篇文章是對(duì)MYSQL中SET類型字段的SQL操作知識(shí)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)

    Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)

    本文主要介紹了Linux安裝Mysql8.0.20并配置主從復(fù)制,包含一主一從和雙主雙從,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • MySQL中的多字段相同數(shù)據(jù)去重復(fù)

    MySQL中的多字段相同數(shù)據(jù)去重復(fù)

    這篇文章主要介紹了MySQL中的多字段相同數(shù)據(jù)去重復(fù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MySQL可重復(fù)讀級(jí)別能夠解決幻讀嗎

    MySQL可重復(fù)讀級(jí)別能夠解決幻讀嗎

    這篇文章主要給大家介紹了關(guān)于MySQL可重復(fù)讀級(jí)別能否解決幻讀的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 如何選擇合適的MySQL日期時(shí)間類型來存儲(chǔ)你的時(shí)間

    如何選擇合適的MySQL日期時(shí)間類型來存儲(chǔ)你的時(shí)間

    這篇文章主要介紹了如何選擇合適的MySQL日期時(shí)間類型來存儲(chǔ)你的時(shí)間,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2020-08-08
  • 查詢MySQL的CPU使用率突然變高的幾種方法

    查詢MySQL的CPU使用率突然變高的幾種方法

    本文詳細(xì)介紹了如何排查和解決MySQL CPU使用率突然變高的問題,包括緊急定位、深入分析和長期監(jiān)控三個(gè)階段,緊急定位階段通過查看當(dāng)前運(yùn)行的線程和MySQL全局狀態(tài),快速鎖定耗CPU的SQL或連接,需要的朋友可以參考下
    2025-12-12

最新評(píng)論

阿鲁科尔沁旗| 宝丰县| 阳山县| 定陶县| 定日县| 临江市| 九龙坡区| 江阴市| 武威市| 大兴区| 临清市| 霍山县| 江源县| 鲜城| 木里| 西畴县| 平阴县| 曲沃县| 伊吾县| 庄浪县| 华容县| 汤原县| 洛扎县| 大埔县| 绍兴市| 施秉县| 湖州市| 镇康县| 海盐县| 洪雅县| 肥西县| 开远市| 鹤岗市| 新兴县| 卓尼县| 贵溪市| 宣恩县| 方山县| 辉南县| 莱西市| 南丹县|