【MySQL】時間型別儲存格式選擇
一 前言
昨天在給開發同學做資料庫設計規範分享的時候,講到時間欄位常用的有三個選擇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
是否為空: 允許為空值,可以自定義值,且insert和update操作不會自動修改其值。
儲存格式: 值以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 欄位。
四 推薦閱讀
1 datatime和timstmap初始化
2 datetime官方文件
3 說說time_zone 帶來的效能問題
昨天在給開發同學做資料庫設計規範分享的時候,講到時間欄位常用的有三個選擇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
是否為空: 允許為空值,可以自定義值,且insert和update操作不會自動修改其值。
儲存格式: 值以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 欄位。
四 推薦閱讀
1 datatime和timstmap初始化
2 datetime官方文件
3 說說time_zone 帶來的效能問題
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-2062312/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql時間欄位格式如何選擇,TIMESTAMP,DATETIME,INT?MySql
- 如何選擇mysql的儲存引擎MySql儲存引擎
- Mysql - 如何決定用 datetime、timestamp、int 哪種型別儲存時間戳?MySql型別時間戳
- mysql 貨幣型別 選擇MySql型別
- mysql 行格式選擇_Mysql 行格式MySql
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- mysql儲存日期使用什麼型別MySql型別
- 資料庫儲存時間到底該用什麼型別?資料庫型別
- 如何正確選擇ARM核心板、ARM工控板的儲存型別?型別
- Mysql 行的儲存格式MySql
- Mysql中儲存引擎簡介、修改、查詢、選擇MySql儲存引擎
- MySQL 中儲存時間的最佳實踐MySql
- MySQL 資料型別分類和選擇MySQL 資料型別
- go 把時間儲存到 MongoDB , 時間是 time 型別MongoDB型別
- element 時間選擇器禁止選擇以前的時間
- element-ui 時間選擇器設定時間選擇範圍UI
- mysql之json型別與文字儲存json的優勢MySqlJSON型別
- 數字化時代NAS儲存的誕生與選擇
- MySQL開發篇,儲存引擎的選擇真的很重要嗎?MySql儲存引擎
- 建立NFS型別的儲存NFS型別
- 高效能Mysql(第3版)_資料型別的選擇_整數型別MySql資料型別
- 如何選擇移動儲存裝置
- 時間型別和時間戳型別時間戳
- localStorage設定儲存時間
- 硬碟格式化時如何選擇?硬碟格式FAT32、NTFS、exFAT的區別硬碟
- 時間序列化資料庫選型?時序資料庫的選擇?資料庫
- MySQL時間型別和模式詳情陸轄MySql型別模式
- 《高效能MySQL》筆記——MySQL建表資料型別的選擇MySql筆記資料型別
- mysql常用儲存引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介紹與如何選擇MySql儲存引擎Hive
- golang 時間轉換,不注意將引發Gorm等mysql操作儲存時間多GolangORMMySql
- 自定義時間選擇器
- Block型別及儲存區域BloC型別
- MySQL時間戳轉成日期格式MySql時間戳
- HTML5有哪些儲存型別?它們之間有什麼區別?HTML型別
- 物件儲存的優勢有哪些?為什麼要選擇物件儲存?物件
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- 設計表時,如何選擇正確的資料型別資料型別
- Flink 的時間型別型別
- SAP EWM - 儲存型別 - 入庫控制型別