原文地址:https://segmentfault.com/a/1190000017393602
MySQL 中常用的兩種時間儲存類型分別是datetime
和 timestamp
。如何在它們之間選擇是建表時必要的考慮。下面就談談他們的區別和怎么選擇。
1 區別
1.1 占用空間
類型 | 占據字節 | 表示形式 |
---|---|---|
datetime | 8 字節 | yyyy-mm-dd hh:mm:ss |
timestamp | 4 字節 | yyyy-mm-dd hh:mm:ss |
1.2 表示范圍
類型 | 表示范圍 |
---|---|
datetime | '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999' |
timestamp | '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999' |
timestamp
翻譯為漢語即"時間戳",它是當前時間到 Unix元年(1970 年 1 月 1 日 0 時 0 分 0 秒)的秒數。對於某些時間的計算,如果是以 datetime
的形式會比較困難,假如我是 1994-1-20 06:06:06
出生,現在的時間是 2016-10-1 20:04:50
,那么要計算我活了多少秒鍾用 datetime
還需要函數進行轉換,但是 timestamp
直接相減就行。
1.3 時區
timestamp
只占 4 個字節,而且是以utc
的格式儲存, 它會自動檢索當前時區並進行轉換。
datetime
以 8 個字節儲存,不會進行時區的檢索.
也就是說,對於timestamp
來說,如果儲存時的時區和檢索時的時區不一樣,那么拿出來的數據也不一樣。對於datetime
來說,存什么拿到的就是什么。
還有一個區別就是如果存進去的是NULL
,timestamp
會自動儲存當前時間,而 datetime
會儲存 NULL
。
2 測試
我們新建一個表
插入數據
查看數據,可以看到存進去的是NULL
,timestamp
會自動儲存當前時間,而 datetime
會儲存NULL
把時區修改為東 9 區,再查看數據,會會發現 timestamp
比 datetime
多一小時
如果插入的是無效的呢?假如插入的是時間戳
結果是0000-00-00 00:00:00
,根據官方的解釋是插入的是無效的話會轉為 0000-00-00 00:00:00
,而時間戳並不是MySQL
有效的時間格式。
那么什么形式的可以插入呢,下面列舉三種
//下面都是 MySQL 允許的形式,MySQL 會自動處理 2016-10-01 20:48:59 2016#10#01 20/48/59 20161001204859
3 選擇
如果在時間上要超過Linux
時間的,或者服務器時區不一樣的就建議選擇 datetime
。
如果是想要使用自動插入時間或者自動更新時間功能的,可以使用timestamp
。
如果只是想表示年、日期、時間的還可以使用 year
、 date
、 time
,它們分別占據 1、3、3 字節,而datetime
就是它們的集合。