之前腦海裏就一念頭總覺得啥時間都用int存儲,最近在項目開發時,頻繁見到datetime類型,對於MySQL數據庫中的有關時間的字段該選用何種類型,引起了一些爭論。因此作了一些簡單的研究,看了一些blog和官方文檔。最後作出一個本身的總結。html
INT類型通常用於存儲Unix時間戳。使用一個簡單的 INT 列保存 Unix 時間是最普通的方法。使用 INT,你能夠確保你要保存的數字能夠快速、可靠地插入到表中。mysql
若是隻是存儲 Unix 時間戳(而且在它的合法日期範圍內),並且不打算在它上面使用任何基於日期的查詢,我以爲使用 INT 是能夠的。它執行簡單數值比較查詢時很是快,由於只是在處理簡單的數字。sql
結論:適合須要進行大量時間範圍查詢的數據表,不支持在此字段上進行MySQL時間函數的運算,好比from_unixtime數據庫
Datetime 和 Timestamp 都保存日期和時間信息,同時,使用人類可讀的日期形式,如 「2018-01-01」。服務器
TIMESTAMP: A four-byte integer representing seconds UTC since the epoch (‘1970-01-01 00:00:00’ UTC)ide
TIMESTAMP:一個四字節的整數,從1970-01-01 00:00:00開始算起。函數
Timestamp 和 Datetime 的核心不一樣點主要在於 MySQL在內部如何表示這些信息:兩種都以二進制而非字符串形式存儲,但在表示日期/時間部分時 Timestamp (4 字節) 比 Datetime (5字節,從MySQL 5.6.4版本起,以前爲8個字節) 少使用 1 字節。當保存毫秒部分時兩種都使用額外的空間 (1到3 字節)。編碼
非分數部分的DATETIME編碼(5.6.4版本以後):.net
1 bit sign (1= non-negative, 0= negative)
17 bits year*13+month (year 0-9999, month 0-12)
5 bits day (0-31)
5 bits hour (0-23)
6 bits minute (0-59)
6 bits second (0-59)unix40 bits = 5 bytes
Timestamp 節省的 1 字節是有代價的:你只能存儲從 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’ 之間的時間。而 Datetime 容許你存儲從 ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’ 之間的任什麼時候間。
另外一個重要的差異是MySQL使用服務器的時區轉換Timestamp值到它的 UTC 等價值再保存。當獲取值是它會再次進行時區轉換,因此你得回了你「原始的」日期/時間值。Datetime 列不會被數據庫改變。不管時區怎樣配置,每次都會保存和獲取到一樣的值。
在5.6版本以後,datetime開始能夠使用current time做爲默認值,因此再也不有timestamp比datetime更適合做爲須要隨插入和更新來變動時間的類型的說法。
結論:Datetime 是大多數場景下的最佳選擇,理由是
- 無需任何轉換便是人類可讀的。
- 不會由於時區變換產生問題。
- 只比它的對手們多用 1 字節
- 支持更大的日期範圍(從 1000 年到 9999 年)
沒有完美的數據類型,只要最合適的數據類型。這麼多類型同時存在必定是有其道理的,瞭解清楚了不一樣類型的差別,就能選擇最合適的類型。
參考: