2011-08-11 52 views
30

我在使用MySQL的TIMESTAMP格式和自定義UNSIGNED INT格式保存日期和時間值時遇到困難。這裏主要考慮的是檢索速度,PHP中適當的範圍計算以及偶爾格式化爲人類可讀的值。使用MySQL的TIMESTAMP與直接存儲時間戳

每種類型及其範圍所需的存儲空間:

DATETIME  8 bytes '1000-01-01 00:00:00' to '9999-12-31 23:59:59' 
TIMESTAMP  4 bytes '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC 
UNSIGNED INT 4 bytes (Maximum Value 4294967295) 

我不需要DATETIME的範圍內的。我在TIMESTAMP和UNSIGNED INT之間被撕裂。

論點支持unsigned int型的:

    4294967295轉換到Sun,2106年2月7日
  • Unix時間戳6時28分15秒格林尼治標準時間比TIMESTAMP越來越配不上我
  • 比較這些時間戳直接在PHP會更快,而不是通過轉換的strtotime的TIMESTAMP(),然後比較它們

唯一的好處時間戳會給我是當我在值從MySQL表手動閱讀和需要「看他們。

是否有任何令人信服的理由使用TIMESTAMP而不是UNSIGNED INT?

+0

查看關聯:[日期時間vs時間戳?](http://stackoverflow.com/questions/409286/datetime-vs-timestamp) – JYelton

+0

32位時間戳只會在2038年1月纔會出現,而且許多庫仍在使用32位time_t而不是64位,所以你可能會遇到可移植性問題。在內部,PHP將時間戳/日期時間存儲爲數字格式,並且只在檢索時轉換爲好的yyyy-mm-dd類型的字符串。 –

回答

20

論據爲TIMESTAMP

  • 它含蓄地存儲在GMT時區數據。不管你的會話時區是什麼。如果您需要使用不同的時區,這很有用。
  • 使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP可以有自動時間戳列(每個表一列只有等到的MySQL 5.6.5)
  • 您可以使用日期時間函數的日期對比,加,減,範圍查找等,而無需使用FROM_UNIXTIME()功能 - 這將使它更容易編寫,可以使用索引
  • 在PHP

    >> date('Y-m-d h:i:s',4294967295); 
    '1969-12-31 11:59:59' 
    

    這樣的範圍實際上是在查詢同一

當UNIX_TIMESTAMP()是在一個TIMESTAMP列中使用時, 返回內部功能時間戳值直接,沒有隱含 「字符串到Unix時間戳」轉換

+1

'echo date('Y-m-d h:i:s',4294967295);'對我來說2106-02-07 06:28:15 - 你使用的是32位操作系統嗎? –

+1

不,這是一個64b Windows,但我認爲我有一個32b PHP運行。如果你希望你的應用程序是可移植的,那麼你需要考慮這些東西。如果你能控制生產環境,那麼絕對不會。 – Mchl

+2

至於你的第二個項目符號,只有一列可以做成DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,正如這裏指出的那樣(至少在MySQL v5.1上):http://dev.mysql.com/doc/refman/5.1/ en/timestamp-initialization.html –

2

這可能不是一個「科學的」a nswer,但我總是找到MySql在TIMESTAMP列上處理轉換,算術運算,比較等操作的方式。一個UNSIGNED INT列更直接,我總是知道會發生什麼。

P.S.也許另一件贊成TIMESTAMP專欄的事情是,它可以在每次更新或插入後自動設置爲當前時間,但這不是沒有的。

8

TIMESTAMP的唯一實際用途是當更新行時(這是該字段的默認行爲)或當數據存儲需求非常嚴格以致每行4個字節時,該字段會自動更新對你有所幫助。

真正的比較應該是DATETIME和unsigned int之間,並且我建議DATETIME因爲:

  • 您可以使用MySQL的本地日期/時間功能按日期範圍等
  • 這是選擇輕鬆地選擇這些日期作爲UNIX時間戳,便於在PHP中進行格式化:SELECT UNIX_TIMESTAMP(field) FROM table,無需選擇原始值並使用時間戳
  • 如果需要,可以直接閱讀和編輯數據庫中的字段指出)。
  • 日期範圍

第二點單獨無限制真正刪除任何理由的整數,存儲在我看來。

+1

DATETIME的缺點是它不會在字段中存儲GMT偏移量。在存儲到GMT之前,您需要轉換所有內容(或者任何您想要的'祖魯'時間),然後在您處理多個時區時將其轉換回來。以INT存儲將刪除其中一些要求。 – ashurexm

+0

DATETIME的一個好處是我很懶,它對於單個語言環境/時區非常有用。 – ashurexm

+0

感謝您對「UNIX_TIMESTAMP」的評論 - 我現在不知道這一點。 –

相關問題