類型對比
| 類型 | 存儲字節 | 範圍 | 精度 | 時區感知 | 適用場景 |
DATE | 3 | 1000-01-01 ~ 9999-12-31 | 天 | 否 | 僅需日期(生日、入職日期) |
TIMESTAMP | 4 | 1970-01-01 ~ 2038-01-19 | 秒 | **是**(存儲 UTC,讀取按會話時區轉換) | 創建/修改時間戳、跨時區應用 |
DATETIME | 8(5.6.4+ 5+微秒位) | 1000-01-01 ~ 9999-12-31 | 秒/微秒 | 否 | 業務時間、歷史/未來日期、需固定顯示 |
INT UNSIGNED | 4 | 同 TIMESTAMP | 秒 | 應用層處理 | **不推薦**:不可讀、無函數支援、維護成本高 |
選擇原則
- **僅需天精度** →
DATE(最省空間,3 字節)。
- **需秒精度 + 跨時區/自動時區轉換** →
TIMESTAMP(4 字節,自帶 UTC 轉換)。
- **需秒/微秒精度 + 固定顯示/超出 2038 年** →
DATETIME(8 字節,無時區轉換)。
- **嚴禁用 INT 存 Unix 時間戳** — 雖省空間但失去 SQL 日期函數、可讀性、時區處理,維護極痛。
最佳實踐組合
CREATE TABLE t_order (
id BIGINT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 下單瞬間,自動 UTC
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 修改自動刷新
delivery_date DATE, -- 預計送達日,無時區
expire_at DATETIME -- 過期時間,固定顯示,可存 2050 年
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;