一 前言
昨天在給開發同學做資料庫設計規範分享的時候,講到時間字段常用的有三個選擇datetime、timestamp、int,應該使用什麼類型的合适?本文通過三種類型的各個次元來分析,聲明:本文沒有具體的結論,但是會給一個推薦使用方式,需要使用者結合自己的業務場景來具體選擇。
二 分析
int型:
存儲長度: 4位元組
表示範圍: date('y-m-d h:i:s', 4294967295) 最大到 2106-02-07 14:28:15 ,如果一個企業活過這麼久,就需要資料庫考慮 bigint 或者datetime類型了。
是否為空: 可以為空,但是業務邏輯設計建議設定非空
存儲格式: 數值類型存儲,節省空間
時區相關: 與時區無關
預設值 : 可以根據業務邏輯設定預設值為某個時間。
優點
1 類型簡單,cpu處理該字段的運算會比較快,占用位元組小,節省空間。
2 查詢速度快。
datetime:
存儲長度: 8位元組
表示範圍:'1000-01-01 00:00:00'-'9999-12-31 23:59:59'
是否為空: 允許為空值,可以自定義值,且insert和update操作不會自動修改其值。
儲存格式: 以實際格式存儲(just stores what you have stored and retrieves the same thing which you have stored.)
預設值 : 不指定預設值的時候 mysql會初始化為'0000-00-00 00:00:00'
mysql> create table `tm` (
-> `d1` int(10) unsigned not null default '0',
-> `d2` timestamp not null default current_timestamp,
-> `d3` datetime not null,
-> `d4` timestamp not null default current_timestamp on update current_timestamp
-> );
query ok, 0 rows affected (0.02 sec)
mysql> insert into tm(d1,d4) values(1458612980,now());
query ok, 1 row affected, 1 warning (0.00 sec)
mysql> select * from tm;
+------------+---------------------+---------------------+---------------------+
| d1 | d2 | d3 | d4 |
| 1458612980 | 2016-03-22 10:16:20 | 2016-03-22 15:21:21 | 2016-03-22 10:16:20 |
| 1458612980 | 2016-03-22 15:22:17 | 0000-00-00 00:00:00 | 2016-03-22 15:22:17 |
2 rows in set (0.00 sec)
優點 顯示直覺,不需使用函數做轉換
timestamp:
存儲長度: 4位元組
是否為空: 允許為空值,但是不可以自定義值,是以為空值時沒有任何意義。
表示範圍:'1970-01-01 00:00:01'-'2038-01-19 03:14:07
存儲格式: 值以utc格式儲存,即以毫秒為機關的數字存儲 ( it stores the number of milliseconds)
時區相關: 和時間相關,時區轉化 ,存儲時對目前的時區進行轉換,檢索時再轉換回目前的時區。
預設值 : 可以設定為current_timestamp(),目前的系統時間。
gmt_modified timestamp not null default '0000-00-00 00:00:00' on update current_timestamp
字段屬性加上 "on update current_timestamp",
1 在更新記錄時不指定update timestamp字段的值,資料庫會自動修改gmt_modified的值為目前系統的時間,
2 在插入記錄時不指定timestamp字段和timestamp字段的值,插入後該字段的值會自動變為目前系統時間。
相比于 init 類型的 可以自動更新為系統目前時間,其他并無優勢。
三 總結
對于如何選型 ,有如下三種層面 性能,存儲空間,時間範圍 的考慮。這裡我從時間範圍和存儲空間層面推薦使用 int 或者bigint ,datetime 類型。bigint和datetime 占用的空間一樣,唯一的差異是在性能上可能存在差異。當然如果你服務的企業有存在 102年的夢想,那我建議直接使用 datetime類型。2038年的時候,雖然我們(80後)估計已經在家養老或者身居高層,為了避免給後來的運維人員留坑,建議不要使用 timestamp 字段。
四 推薦閱讀