MySQL中的DATETIME 和 TIMESTAMP典型用法及關鍵區(qū)別
在 MySQL 里,DATETIME 和 TIMESTAMP 雖都用于存儲日期時間數(shù)據,但在存儲范圍、時區(qū)處理、存儲空間、默認行為等方面差異顯著,詳細對比分析如下:
一、存儲范圍
| 類型 | 取值范圍 | 限制原因 | 適用場景 |
|---|---|---|---|
DATETIME | 1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999 | 無特殊限制,覆蓋極廣時間范圍 | 需記錄歷史久遠或未來遠期時間(如古籍文獻時間、項目長期規(guī)劃時間 ) |
TIMESTAMP | 1970-01-01 00:00:01.000000 UTC 到 2038-01-19 03:14:07.999999 UTC | 基于 Unix 時間戳(32 位整數(shù)存秒數(shù) ),受整數(shù)范圍限制 | 記錄系統(tǒng)事件(如創(chuàng)建/修改時間 ),但需注意 2038 年“溢出”問題 |
二、時區(qū)處理
| 類型 | 時區(qū)相關性 | 存儲與查詢邏輯 | 示例(當前時區(qū) +08:00 ,插入 2025-06-20 14:18:00 ) |
|---|---|---|---|
DATETIME | 與時區(qū)無關,原樣存儲 | 插入時存輸入值,查詢時直接返回,不受 MySQL 時區(qū)設置影響 | 存 2025-06-20 14:18:00 ,查出來還是 2025-06-20 14:18:00 |
TIMESTAMP | 與時區(qū)相關,基于 UTC 轉換 | 插入時,MySQL 會將當前時區(qū)時間轉為 UTC 存儲;查詢時,再轉回當前會話時區(qū)顯示 | 插入時,+08:00 時間會轉成 UTC 時間 2025-06-20 06:18:00 存儲;查詢時,再轉回 +08:00 顯示 2025-06-20 14:18:00 |
三、存儲空間
| 類型 | 基礎存儲大?。o小數(shù)秒) | 小數(shù)秒存儲(如 .nnnnnn ) | 說明(MySQL 版本差異 ) |
|---|---|---|---|
DATETIME | 5 字節(jié)(MySQL 5.6.4+ ) | 小數(shù)部分占 0 - 3 字節(jié)(取決于精度,如 .000001 占 3 字節(jié) ) | 5.6.4 前占 8 字節(jié),之后優(yōu)化為 5 字節(jié) + 小數(shù)部分 |
TIMESTAMP | 4 字節(jié) | 小數(shù)部分占 0 - 3 字節(jié) | 始終基于 Unix 時間戳的存儲優(yōu)化,空間占用更小 |
四、默認值與自動更新行為
| 類型 | 默認值規(guī)則 | 自動更新支持 | 示例(表設計 ) |
|---|---|---|---|
DATETIME | 默認不自動賦值,若未指定 DEFAULT ,插入后為 NULL | 需手動設置(如 DEFAULT CURRENT_TIMESTAMP 或 ON UPDATE CURRENT_TIMESTAMP ) | sql<br>-- 需手動指定默認值才會自動填充<br>ALTER TABLE t ADD COLUMN dt DATETIME DEFAULT CURRENT_TIMESTAMP;<br> |
TIMESTAMP | 未顯式賦值時,默認填當前時間戳(CURRENT_TIMESTAMP ) | 支持自動初始化(DEFAULT CURRENT_TIMESTAMP )和更新(ON UPDATE CURRENT_TIMESTAMP ) | sql<br>-- 插入時自動填當前時間,更新行時自動更新時間<br>ALTER TABLE t ADD COLUMN ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;<br> |
五、應用場景與典型用法
DATETIME適用場景- 需記錄與時區(qū)無關的精確時間(如事件發(fā)生的固定時間點,不管服務器時區(qū)如何,時間都不變 )。
- 需存儲歷史久遠或未來遠期時間(如考古數(shù)據的時間記錄、項目截止到 9999 年的任務 )。
- 示例:
-- 記錄文物出土時間,無論數(shù)據庫時區(qū)如何,時間固定
CREATE TABLE relics (
id INT PRIMARY KEY,
unearthed_time DATETIME -- 存如 `1000-01-01 12:00:00`
);TIMESTAMP適用場景- 需跨時區(qū)自動轉換的場景(如全球化應用,不同時區(qū)用戶看到的時間自動適配本地時區(qū) )。
- 需自動記錄創(chuàng)建/修改時間(如
create_time自動填當前時間,update_time更新時自動修改 )。
- 示例:
-- 自動記錄創(chuàng)建和修改時間,跨時區(qū)訪問時自動轉換
CREATE TABLE users (
id INT PRIMARY KEY,
create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 插入時自動填當前時間
update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新時自動更新
);六、關鍵區(qū)別總結(表格版)
| 特性 | DATETIME | TIMESTAMP |
|---|---|---|
| 存儲范圍 | 極廣(1000-01-01 到 9999-12-31 ) | 有限(1970-01-01 UTC 到 2038-01-19 UTC ) |
| 時區(qū)處理 | 與時區(qū)無關,原樣存儲 | 與 UTC 關聯(lián),插入/查詢時自動時區(qū)轉換 |
| 存儲空間 | 5 字節(jié)(5.6.4+ ,無小數(shù)秒 ) | 4 字節(jié)(無小數(shù)秒 ) |
| 默認值行為 | 需手動設置默認值,否則為 NULL | 未賦值時默認填當前時間戳 |
| 自動更新 | 需手動開啟(ON UPDATE ) | 支持自動初始化和更新(常用作修改時間字段 ) |
| 典型場景 | 固定時間點記錄(如合同簽訂時間 ) | 系統(tǒng)事件時間(如創(chuàng)建/修改時間 )、跨時區(qū)應用 |
實際使用時,若需處理跨時區(qū)業(yè)務或自動記錄修改時間,選 TIMESTAMP;若需存遠期時間、固定時間點且與時區(qū)無關,選 DATETIME。需注意 TIMESTAMP 的 2038 年限制,長期業(yè)務需提前規(guī)劃替代方案(如遷移到 DATETIME 或用大數(shù)據時間類型 )。
到此這篇關于在 MySQL 里,DATETIME 和 TIMESTAMP的文章就介紹到這了,更多相關mysql datetime和timestamp內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MySQL日期ATE、TIME、DATETIME、TIMESTAMP和YEAR的使用語句
- MySQL數(shù)據時區(qū)問題以及datetime和timestamp類型存儲的差異
- MySQL之DATETIME與TIMESTAMP的時間精度問題
- MySQL?時間類型用?datetime,?timestamp?還是?integer?更好
- 淺談Mysql時間的存儲?datetime還是時間戳timestamp
- 詳解MySQL中timestamp和datetime時區(qū)問題導致做DTS遇到的坑
- MySQL 中 datetime 和 timestamp 的區(qū)別與選擇
- MySQL中datetime和timestamp的區(qū)別及使用詳解
- Mysql中的Datetime和Timestamp比較
相關文章
Linux centos7環(huán)境下MySQL安裝教程
這篇文章主要為大家詳細介紹了Linux centos7環(huán)境下MySQL安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Mysql保持現(xiàn)有內容在后面增加內容的sql語句
這篇文章主要介紹了Mysql保持現(xiàn)有內容在后面增加內容的sql語句,需要的朋友可以參考下2017-05-05

