2016-12-15 104 views
0

我想正確的插入行到數據庫之前設置CURRENT_TIMESTAMP爲UTC。從我讀過的內容來看,這就是你如何通過連接來完成它。MySQL的每個連接的時區不填充CURRENT_TIMESTAMP正確

我的服務器的時區是EST(+5:00)。

我做了以下在調試時:

  1. SELECT CURRENT_TIMESTAMP;存儲這個人在調試時使用。
  2. SET TIME_ZONE ='-00:00';
  3. SELECT CURRENT_TIMESTAMP;存儲這個人在調試時使用。
  4. 截至目前,我希望我的數據庫連接的time_zone是UTC。
  5. 插入/更新記錄照常。

然後,我將兩個時間戳傳遞迴我的頁面,看看它們是什麼。

第一個被默認爲EST:[CURRENT_TIMESTAMP] => 2016-12-15 14:01:52

二是UTC通過查詢設置:[CURRENT_TIMESTAMP] => 2016-12-15 19:01:52

然而,在數據庫中記錄有2016年12月15日14:01的CURRENT_TIMESTAMP: 52(美國東部時間)。

不知道爲什麼!


我正在使用Sequel Pro查看我的數據庫。 似乎Sequel Pro會將時間戳轉換爲當地時間。

通過SQL該記錄返回所期望/預期:

2016-12-15 19:46:50

續集專業顯示:

2016-12-15 14:46:50

所以......這讓我心煩一點點我的選擇數據庫應用程序如何處理時區。如果有人認爲這不是真正的問題,所有的手段讓我知道:)

回答

1

TIMESTAMP數據類型是總是存儲在MySQL中的UTC。除了通過抵消它之外,沒有辦法參考其他時區來存儲它。翻譯完成後,使用當前的time_zone設置進行翻譯。除了通過設置time_zone設置爲UTC-00:00或某些等價物,然後閱讀它,沒有辦法查看存儲的TIMESTAMP實際值。

所以,

SET time_zone = 'America/Halifax'; 
SELECT @a := CURRENT_TIMESTAMP; --> 2016-12-15 15:49:49 
SET time_zone = 'UTC'; 
SELECT @a, CURRENT_TIMESTAMP;  --> 2016-12-15 15:49:49 2016-12-15 19:49:49 
SET time_zone = 'America/Halifax'; 
SELECT @a, CURRENT_TIMESTAMP;  --> 2016-12-15 15:49:49 2016-12-15 15:49:49 

在該序列的第二行,當前時間戳呈現爲一個文本字符串變量@a,在大西洋標準時間的情況下。

第四個顯示文本字符串,然後顯示在UTC上下文中呈現的當前時間戳。

DATETIME and DATE數據是逐字存儲的,沒有參考時區設置。

+0

這是總的意義。但是,我發現這個問題似乎與我用來查看我的數據庫數據的應用程序(Sequel Pro)有關。該記錄按預期從SELECT語句返回,但在應用程序中顯示不同。 – Gurnzbot