MySQL 不支援 DEFAULT NOW() 或 DEFAULT CURRENT_TIMESTAMP(5.6.5 前)。解決方案:使用 TIMESTAMP 型別,利用其內建自動初始化與更新特性。
| 定義 | 顯示格式 | 儲存精度 |
|---|---|---|
| TIMESTAMP(14) | YYYYMMDDHHMMSS | 統一 14 位元完整精度 |
| TIMESTAMP(12) | YYMMDDHHMMSS | |
| TIMESTAMP(10) | YYMMDDHHMM | |
| TIMESTAMP(8) | YYYYMMDD | |
| TIMESTAMP(6) | YYMMDD | |
| TIMESTAMP(4) | YYMM | |
| TIMESTAMP(2) | YY |
關鍵:無論顯示長度,內部皆儲存完整秒級時間(1970-01-01 ~ 2038-01-19)。
表中第一個 TIMESTAMP 欄位擁有自動特性:
NOW())。DEFAULT CURRENT_TIMESTAMP(5.6.5+)。CREATE TABLE t (
id INT PRIMARY KEY AUTO_INCREMENT,
ts1 TIMESTAMP(14), -- 第 1 個:自動初始化+更新
ts2 TIMESTAMP(14), -- 第 2 個:無自動特性
ts3 TIMESTAMP(14) DEFAULT CURRENT_TIMESTAMP -- 5.6.5+ 可指定預設
);
INSERT INTO t (ts1, ts2, ts3) VALUES (NULL, NULL, NULL);
-- ts1=now, ts2=now, ts3=now
INSERT INTO t () VALUES ();
-- ts1=now, ts2=0000..., ts3=now (5.6.5+)
UPDATE t SET id=2 WHERE id=1;
-- ts1 更新為 now(因 id 變化),ts2 不變,ts3 不變
UPDATE t SET ts1=ts1, ts3=NOW() WHERE id=2;
-- ts1 不變(顯式給相同值),ts3 更新為 now
SELECT id,
DATE_FORMAT(ts1, '%Y-%m-%d %H:%i:%s') AS ts1,
DATE_FORMAT(ts2, '%Y-%m-%d %H:%i:%s') AS ts2
FROM t;
| 轉換方向 | 結果 |
|---|---|
| DATE → DATETIME/TIMESTAMP | 時間部份補 00:00:00 |
| DATETIME/TIMESTAMP → DATE | 截斷時間部份 |
| '1968-01-01' → TIMESTAMP | 非法,轉為 0(超出 1970-2038 範圍) |
| 2 位數年份 | 00-69→2000-2069, 70-99→1970-1999 |
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP(5.6.5+),updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。updated_at,created_at 用 DATETIME + 應用層寫入。DATETIME(範圍 1000-9999 年)+ 應用層維護。善用 TIMESTAMP 自動特性,少寫代碼、少出錯、時間欄位永不為空。