一段話系列-MySQL中date、datetime、timestamp的區別以及取捨

三者之間的區別(mysql 5.6+)html

  存儲範圍 佔用空間(字節) 是否與時區相關 默認值 存儲方式

編碼方式mysql

是否根據時區轉換
date

1000-01-01sql

數據庫

9999-12-31編碼

3 無關 null 二進制

1bit用來存符號位,表示正負 spa

1 bit  sign    (1= non-negative, 0= negative)htm

17bit用來存放年和月
17 bits year*13+month    (year 0-9999, month 0-12)ci

5bit用來存放日
 5 bits day     (0-31)
---------------------------文檔

一共23bit約爲3個字節
23 bits = 3 bytesit

datetime

1000-01-01 00:00:00

9999-12-31 23:59:59

5

當保存毫秒部分時使用額外的空間 (1到3 字節)

無關

null 二進制

1bit用來存符號位,表示正負 

1 bit  sign    (1= non-negative, 0= negative)

17bit用來存放年和月
17 bits year*13+month    (year 0-9999, month 0-12)

5bit用來存放日
 5 bits day    (0-31)

5bit用來存放時
 5 bits hour    (0-23)

5bit用來存放分
 6 bits minute    (0-59)

5bit用來存放秒
 6 bits second    (0-59)
---------------------------

一共40bit恰好5個字節
40 bits = 5 bytes

timestamp

1970-01-01 00:00:00

2038-01-09 03:14:07

4

當保存毫秒部分時使用額外的空間 (1到3 字節)

相關

CURRENT_TIMESTAMP(當前時間)

默認狀況下,

insert、update 數據時,TIMESTAMP列會自動以當前時間填充/更新

二進制

存的是自【1970-01-01,UTC】以來的秒數。

PS:在5.6版本以後,datetime開始能夠使用current time做爲默認值,因此再也不有timestamp比datetime更適合做爲須要隨插入和更新來變動時間的類型的說法

date這個主要是表示日期的,用途上面沒有什麼須要抉擇的。

對於timestamp和datetime,道友們可能還有選擇困難症,在這裏我發表一下本身的見解:

在5.6+的mysql數據庫中,timestamp這個基本能夠棄用了,以datetime爲主。若是遇到跨時區的需求時,建議使用long或者bigint進行時間戳的存儲,而後在代碼中進行轉換,不建議用timestamp;

Mysql相關文檔:https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html

參考博文:https://juejin.im/entry/5b6fcb1b6fb9a009d15a2c5c

相關文章
相關標籤/搜索