25,MySQL 8.0參考手冊 5.1.10 MySQL伺服器時區支援
MySQL伺服器維護幾個時區設定:
系統時區。當伺服器啟動時,它會嘗試確定主機的時區並使用它來設定
system_time_zone
系統變數。該值此後不會改變。您可以在啟動時使用mysqld_safe 選項為MySQL伺服器設定系統時區 。您也可以在啟動mysqld之前通過設定環境變數來設定它。對於允許值或 是取決於系統。請查閱您的作業系統文件以檢視可接受的值。
--timezone=
timezone_name
TZ
--timezone
TZ
伺服器的當前時區。全域性
time_zone
系統變數指示伺服器當前正操作的時區。為初始值time_zone
是'SYSTEM'
,其指示該伺服器時區是相同的系統時區。如果設定為
SYSTEM
,則每個需要時區計算的MySQL函式呼叫都會呼叫系統庫來確定當前系統時區。此呼叫可能受全域性互斥體保護,導致爭用。初始全域性伺服器時區值可以在啟動時通過 命令列上的選項顯式指定 ,也可以在選項檔案中使用以下行:
--default-time-zone=
timezone
default-time-zone='timezone'
如果您擁有
SYSTEM_VARIABLES_ADMIN
或SUPER
特權,則可以使用以下語句在執行時設定全域性伺服器時區值:mysql> SET GLOBAL time_zone = timezone;
每連線時區。每個連線的客戶端都有自己的時區設定,由會話
time_zone
變數給出 。最初,會話變數從全域性變數中獲取其值time_zone
,但客戶端可以使用以下語句更改其自己的時區:mysql> SET time_zone = timezone;
當前會話時區設定會影響對區域敏感的時間值的顯示和儲存。這包括諸如NOW()
或 的函式顯示的值 CURTIME()
,以及儲存在TIMESTAMP
列中並從列中檢索的值。TIMESTAMP
列的值從當前時區轉換為UTC儲存,並從UTC轉換到當前時區以供檢索。
當前時區設定不影響由功能顯示的值,如UTC_TIMESTAMP()
在或值DATE
, TIME
或 DATETIME
列。這些資料型別中的值也不以UTC儲存; TIMESTAMP
值轉換時。如果你想區域特定算術 DATE
, TIME
或 DATETIME
值,將其轉換為UTC,執行算術,然後再轉換回。
全域性和客戶特定時區的當前值可以像這樣獲取:
mysql> SELECT @@global.time_zone, @@session.time_zone;
timezone
值可以用幾種格式給出,其中沒有一個是區分大小寫的:
該值
'SYSTEM'
表示時區應該與系統時區相同。該值可以以字串的形式給出,指示與UTC的偏移量,如
'+10:00'
或'-6:00'
。該值可以被給定為指定的時間區,如
'Europe/Helsinki'
,'US/Eastern'
,或'MET'
。只有在mysql
資料庫中的時區資訊表已被建立並填充後,才能使用命名時區。
填充時區表
mysql
系統資料庫中有 多個表用於維護時區信。MySQL安裝過程建立時區表,但不載入它們。您必須使用以下說明手動執行此操作。
載入時區資訊不一定是一次性操作,因為資訊偶爾會改變。發生此類更改時,使用舊規則的應用程式將變得過時,並且您可能會發現需要重新載入時區表以使MySQL伺服器使用的資訊保持最新狀態。請參閱本節末尾的註釋。
如果您的系統具有自己的 zoneinfo資料庫(描述時區的檔案集),則應使用 mysql_tzinfo_to_sql程式填充時區表。這樣的系統的例子是Linux,FreeBSD,Solaris和OS X.這些檔案的一個可能位置是 /usr/share/zoneinfo目錄。如果您的系統沒有zoneinfo資料庫,則可以使用本節後面所述的可下載軟體包。該mysql_tzinfo_to_sql程式用於裝載時區表。在命令列上,將zoneinfo目錄路徑名稱傳遞給mysql_tzinfo_to_sql並將輸出傳送到mysql程式。例如:
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
讀取您系統的時區檔案並從中生成SQL語句。 mysql處理這些語句來載入時區表。也可用於載入單個時區檔案或生成閏秒資訊:要載入tz_file與時區名稱對應的單個時區檔案 ,請像這樣tz_name呼叫
shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
採用這種方法,您必須執行單獨的命令來載入伺服器需要了解的每個命名區域的時區檔案。
如果您的時區需要考慮閏秒,請像這樣初始化閏秒資訊,其中
tz_file
是您的時區檔案的名稱:shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
在執行mysql_tzinfo_to_sql之後,最好重新啟動伺服器,以便它不會繼續使用任何先前快取的時區資料。
如果您的系統沒有zoneinfo資料庫(例如Windows),那麼您可以使用可在MySQL Developer Zone上下載的軟體包:
http://dev.mysql.com/downloads/timezones.html
下載包含SQL語句的時區包並將其解壓縮,然後將包檔案內容載入到時區表中:
shell> mysql -u root mysql < file_name
然後重新啟動伺服器。
警告千萬不能使用包含一個可下載的包MyISAM
桌。MySQL InnoDB
用於時區表。試圖用MyISAM
表替換它們會導致問題。
如果您的系統有zoneinfo資料庫,請不要使用可下載的軟體包。改用mysql_tzinfo_to_sql工具。否則,您可能會在MySQL和系統上的其他應用程式之間的日期時間處理方面產生差異。