MYSQL時間類別總結: TIMESTAMP、DATETIME、DATE、TIME、YEAR


總結背景: 對於MYSQL數據庫日期類型或多有了解, 但並很清晰其中一些規則. 基本都是面向瀏覽器編碼, 這實質上也是一種方式.  但期間遇到兩個問題:

  • 時常遇到建表中出現多個datetime或者timestamp字段並使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP時報錯, 難以查到原因, 最后粗暴的直接去掉
  • 查詢網絡非官方文檔知識點不全, 越查越糊塗 

因為這兩點 促使我硬着頭皮查看MYSQL的官方文檔 雖然剛開始很難受 結果的確收獲頗多. 以下是我的一點總結:

1、類型簡介

2、Automatic Initialization and Updating for TIMESTAMP and DATETIME

3、總結

 

1、類型簡介

1.1、存儲使用的長度 

MySQL 5.6.4版本之后允許TIME、TIMESTAMP、DATETIME類型具有[0-6]位小數部分(Fractional Seconds in Time Values),  因而存儲使用長度為變化的 

Data Type Storage Required Before MySQL 5.6.4 Storage Required as of MySQL 5.6.4
YEAR 1 byte 1 byte
DATE 3 bytes 3 bytes
TIME 3 bytes 3 bytes + fractional seconds storage
DATETIME 8 bytes 5 bytes + fractional seconds storage
TIMESTAMP 4 bytes 4 bytes + fractional seconds storage

例如 time類型使用3 bytes存儲, 加上小數部分長度. 而需要多少長度,取決於小數的長度:

Fractional Seconds Precision Storage Required
0 0 bytes
1, 2 1 byte
3, 4 2 bytes
5, 6 3 bytes

例如 , TIME(0)TIME(2)TIME(4), and TIME(6) 分別總共使用 3, 4, 5, and 6 bytes . TIME and TIME(0) 實質是一樣的, 都需要3 bytes進行存儲 .

 

1.2、字段聲明和表示范圍

由於MYSQL官方文檔已經很清晰 直接附上原始文檔 Date and Time Type Overview 這里只分析需要注意的點:

  • DATE 表示范圍在'1000-01-01' to '9999-12-31' 存儲格式為'yyyy-mm-dd',也可能出現年使用 two-digit表示 例如: 12-01-01 MYSQL解釋規則為: 00-69解釋為2000-2069 70-99解釋為1970-1999
  • TIMESTAMP表示范圍在'1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC , 而MySQL將TIMESTAMP值從當前時區轉換為UTC以進行存儲,並從UTC轉換回當前時區以進行檢索。如果期間時區發生的變化, 例如存儲之后修改時區Section 5.1.12, “MySQL Server Time Zone Support. 那么取出來和之前存入的數據將不一致.
  • DATETIME表示范圍為'1000-01-01 00:00:00' to '9999-12-31 23:59:59' 無時區.
  • 如果strict mode禁用 , 非法 DATEDATETIME, or TIMESTAMP 的時間會被轉換為“零值” 根據類型轉換為'0000-00-00' or '0000-00-00 00:00:00', 否則直接會報錯
  • YEAR存在歷史問題 YEAR(4) 和 YEAR(2)(YEAR(2) Limitations and Migrating to YEAR(4)). YEAR(2)在MySQL 5.6.6之后已標注過時,使用YEAR(2)會被強制轉換為YEAR(4)並產生warnings.
  • YEAR允許使用 YY format 和 字符串('0'-'99', '0'-'69'表示20002069' '70'-'99'表示1970-1999)、數字(1-99, 1-69表示2001-2069 70-99表示1970-1999)進行賦值. 

 

2、Automatic Initialization and Updating for TIMESTAMP and DATETIME(自動初始化 和 自動更新)

 由於文章寫的比較詳細, 這里不再贅述, 給出原文鏈接 Automatic Initialization and Updating for TIMESTAMP and DATETIME 和 explicit_defaults_for_timestamp

 

3、總結

 知識還是需要系統性的了解, 即使記不住也沒關系. 下次再去查詢文檔資料的時候會更有針對性.  而對於大多權威的技術文章都是英文 需要耐心下來閱讀 一定有所收獲.

 

主要參考鏈接: Date and Time Types


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM