首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL TIMESTAMP 時間戳完整指南:四大變體、顯示尺寸、自動更新規則與 2038 年問題

     編輯:MySQL 資料庫相關知識

四大定義變體與行為矩陣

定義語法DEFAULT 值ON UPDATE 行為典型用途
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP當前時間自動更新修改時間 updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP當前時間不更新創建時間 created_at
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP0000-00-00 00:00:00自動更新極少用
TIMESTAMP DEFAULT '2024-01-01 00:00:00' ON UPDATE CURRENT_TIMESTAMP固定值自動更新基準時間 + 自動更新

顯示尺寸與存儲實相

列類型顯示格式實際存儲
TIMESTAMP(14)YYYYMMDDHHMMSS統一 4 字節
存儲完整 14 位秒級時間戳
TIMESTAMP(12)YYMMDDHHMMSS
TIMESTAMP(10)YYMMDDHHMM
TIMESTAMP(8)YYYYMMDD
TIMESTAMP(6)YYMMDD
TIMESTAMP(4)YYMM
TIMESTAMP(2)YY

關鍵規則

  • 定義長度 0 或 >14 → 強制 14
  • 奇數長度 → 向上取偶 (1→2, 5→6)
  • 存儲始終完整 14 位,顯示尺寸僅影響查詢返回格式
  • ALTER TABLE ... TIMESTAMP(14) 可「恢復」被截斷顯示的時分秒

自動更新觸發條件 (僅首個 TIMESTAMP 列)

  1. INSERT/LOAD DATA 未顯式指定該列值
  2. UPDATE 未顯式指定該列值,且其他列有實際變更
  3. 顯式設定該列為 NULL
  4. 非首個 TIMESTAMP 列:設為 NULL 或 NOW() 可觸發更新

實戰演示

CREATE TABLE ts_demo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ts1 TIMESTAMP(14) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ts2 TIMESTAMP(14) DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO ts_demo (id) VALUES (1);
-- ts1=2024-01-01 10:00:00, ts2=2024-01-01 10:00:00

UPDATE ts_demo SET id=2 WHERE id=1;
-- ts1=2024-01-01 10:00:05 (自動更新), ts2=2024-01-01 10:00:00 (不變)

UPDATE ts_demo SET id=3, ts1=ts1 WHERE id=2;
-- ts1 不變 (ts1=ts1 視為無實際變更), ts2 不變

UPDATE ts_demo SET id=4, ts2=NOW() WHERE id=3;
-- ts1 自動更新, ts2=當前時間 (顯式觸發)

格式化輸出

SELECT id,
    DATE_FORMAT(ts1, '%Y-%m-%d %H:%i:%s') AS ts1_full,
    DATE_FORMAT(ts2, '%Y-%m-%d') AS ts2_date
FROM ts_demo;

跨類型賦值陷阱

源類型 → 目標類型結果
DATE → DATETIME/TIMESTAMP時間部分補 00:00:00
DATETIME/TIMESTAMP → DATE時間部分截斷丟失
DATETIME → TIMESTAMP超出 1970-2038 範圍 → 變 0

2038 年問題與避坑

  • 範圍:1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC (32 位有符號整數上限)
  • 風險:長期項目 (銀行、保單、日誌) 將在 2038 年溢出
  • 方案:
    • 改用 DATETIME (8 字節,範圍至 9999 年)
    • 改用 BIGINT 存儲毫秒級時間戳 (應用層處理)
    • MySQL 8.0+ 考慮 TIMESTAMP(6) 微秒擴展 (但範圍未變)

兩位數年份解析規則

  • 00-69 → 2000-2069
  • 70-99 → 1970-1999
  • 建議:永遠使用四位數年份,避免歧義

工具推薦

Unix 時間戳轉換工具 (含 PHP/MySQL/Java/Go/SQL Server 多語言操作):https://tools.jb51.net/code/unixtime

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