首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL TIMESTAMP 時間戳深度解析:變體、顯示寬度、自動更新與函數限制

     編輯:MySQL 綜合教學

TIMESTAMP 四大變體

定義建立時更新時
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP當前時間自動刷新為當前時間
TIMESTAMP DEFAULT CURRENT_TIMESTAMP當前時間不變
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP0(零值)自動刷新
TIMESTAMP DEFAULT 'YYYY-MM-DD HH:MM:SS' ON UPDATE CURRENT_TIMESTAMP指定固定值自動刷新

MySQL 不支援 DEFAULT NOW() 等函數預設值,需用 TIMESTAMP 實現自動時間戳。

顯示寬度與儲存

  • 完整 14 位:YYYYMMDDHHMMSS
  • 常見寬度:14、12、10、8、6、4、2
  • 實際儲存永遠 14 位完整精度,寬度只影響顯示
  • 定義寬度 0 或 >14 → 強制 14;奇數寬度 → 下一個偶數

隱含資訊與 ALTER TABLE

  • 窄寬度(如 TIMESTAMP(8))插入資料時仍存完整時分秒,查詢只顯示日期
  • ALTER TABLE ... MODIFY col TIMESTAMP(14) 擴大寬度 → 隱藏的時分秒重現
  • 縮小寬度不丟失資料,僅顯示變少

函數操作限制

  • 直接操作儲存值僅 UNIX_TIMESTAMP()
  • HOUR()、SECOND() 等需格式化後的值包含對應部分(寬度 ≥ 10 才有時)
  • 格式化輸出用 DATE_FORMAT(ts, '%Y-%m-%d %H:%i:%s')

自動更新規則(首個 TIMESTAMP 欄位)

  1. INSERT/LOAD DATA 未指定該欄位
  2. UPDATE 未指定且其他欄位實際改變(設為原值不觸發)
  3. 明確設為 NULL

其他 TIMESTAMP 欄位需明確設 NULL 或 NOW() 才自動更新。

類型轉換與範圍陷阱

  • DATE → TIMESTAMP:時間補 00:00:00
  • TIMESTAMP → DATE:時間截斷
  • TIMESTAMP 範圍 1970-01-01 至 2038-01-19,超出變零值
  • 兩位數年份:00-69→2000-2069,70-99→1970-1999
  • 字串 '10:11:12' 被解析為 2010-11-12(年月日),非時間

驗證範例

CREATE TABLE test (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ts1 TIMESTAMP(8),
    ts2 TIMESTAMP(14)
);
INSERT INTO test (ts1, ts2) VALUES (NULL, NULL);
SELECT * FROM test;
ALTER TABLE test MODIFY ts1 TIMESTAMP(14);
SELECT * FROM test;  -- ts1 顯示完整時分秒

總結

TIMESTAMP 適合自動記錄建立/修改時間,但範圍受限、函數操作有門檻、顯示寬度易誤導。新專案建議:建立時間用 DATETIME DEFAULT CURRENT_TIMESTAMP(MySQL 8.0+),修改時間用 DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,避開所有坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved