2013-03-11 71 views
1

我有一個設置爲本地時區的MySQL數據庫。時間插入爲UTC時間,儘管數據庫使用不同的時區。我想在MySQL服務器上將時區更改爲UTC。我找到了關於如何做到這一點的文檔,但我不願意,因爲我不知道這是否也會改變已存儲在數據庫中的值。會更改數據庫中DateTime字段的MySQL時區更改值嗎?

我的問題:更改MySQL服務器的時區是否也會改變已存儲的值?

回答

4

原則上不應該。有多種原因不應該改變,具體取決於值的類型:主要是DATETIME和TIMESTAMP。

DATETIME值從不轉換,因此它們獨立於時區。

TIMESTAMP值將從當前時區轉換爲UTC(用於存儲),並從UTC返回到當前時區,以便轉換(從此處的直接引用---我假設您有一個相當新的MySQL版本) (對於其他類型,例如DATETIME,這種情況不會發生)默認情況下,每個連接的當前時區是服務器的時間,時區可以基於每個連接設置,只要時區設置如果存儲TIMESTAMP值,然後更改時區並檢索該值,則檢索到的值將與您存儲的值不同,這是因爲同一時區不是用於雙向轉換。「 (來自http://dev.mysql.com/doc/refman/5.5/en/datetime.html)。

因此,在這兩種情況下,實際存儲在服務器上的數據都不會改變(這是它應該是的),但查詢顯示的值可能會在前後不同。

+0

所以,如果我讀正確,因爲我使用的DATETIME值,而不是時間戳值,如果我改變了服務器的時區,這將不會對查詢的任何影響 – Richard 2013-03-11 13:10:28

+0

理查德,是的,我明白這一點。現在,如果你可以設置一個測試服務器,你可以試試它是完全確定的,但是即使沒有執行測試,我也沒有看到MySQL存儲的數據如果沒有明確地做,就不能改變。 – lmsteffan 2013-03-11 13:21:46

+0

@理查德,我不熟悉夏令時在MySQL中的處理(這就是你的意思是「春季飛躍前進」,對吧?),但是你確定它確實會改變儲存值嗎?它可能是你(可能)使用的連接器,它們呈現這些值的方式不同嗎? – lmsteffan 2013-03-11 18:05:06

0

這取決於您是使用TIMESTAMP還是DATETIME列來存儲您的時間戳。

TIMESTAMP時間自動從本地時間(精確地:從連接的時區設置)轉換爲UTC時間,當它們存儲在MySQL表中時。當它們被檢索時,它們會從UTC轉換到當地時間。

但是DATETIME時間戳存儲和檢索完全按照您的應用程序呈現給MySQL。因此,如果您將默認時區更改爲UTC,然後檢索TIMESTAMP值,則會以UTC形式返回。所以他們會看起來像他們改變。但是改變的是自動翻譯。

更改MySQL默認時區不會更改任何表內容。

您可以通過在連接到MySQL時發出以下命令來進行試驗。

SET time_zone = '+0:00'; 

這將改變您的連接的時區設置而不會改變其他任何東西。

重新配置生產服務器時要小心,您知道自己在做什麼:您說您的「MySQL數據庫...設置爲本地時區」。您需要在更改任何內容前仔細調查設置。因爲這是可能影響事物的設置。 (1)運行MySQL服務器軟件的服務器上的時鐘設置。

(2)該機器上的時區設置。 (3)運行MySQL服務器時的默認(aka全局)時區設置。

在大多數現代服務器中,時鐘設置爲正確的UTC時間,時區設置設置爲用戶期望的任何本地時區。而且,MySQL服務器的默認時區設置被設置爲相同的本地時區。您需要驗證這些事情是否正確。

如果您的服務器的時間自動正確地從標準時間翻轉到夏令時(昨天早上在美國),前兩個可能是正確的。

如果你發出這個MySQL命令:SELECT @@global.time_zone' and get back either your local time zone name or SYSTEM the third is right. Also issue SELECT NOW()`來仔細檢查。如果你在一天的正確時間,你的系統可能沒問題。最後,發出這兩個命令:

SET time_zone = '+0:00'; 
SELECT NOW(); 

如果您從系統中獲得正確的當前UTC時間,那麼一切都是已知的和良好的狀態,你已準備好進行時區切換。

通過更改MySQL配置文件中的system_time_zone變量並重新啓動MySQL服務器來創建交換機。在這裏看到的方向:

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html