MySQL 5.6.6 起 TIMESTAMP 隱式預設值行為被棄用,啟動會警告。本文對比 5.5/5.6 行為差異,解釋 explicit_defaults_for_timestamp 參數作用與遷移建議。
一、MySQL 5.5 時代隱式行為 (已棄用)
| 場景 | 5.5 隱式行為 |
| 首個 TIMESTAMP NOT NULL 無預設 | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
| 第二個 TIMESTAMP NOT NULL 無預設 | DEFAULT '0000-00-00 00:00:00' |
| 插入 NULL 到 TIMESTAMP NOT NULL | 自動存 CURRENT_TIMESTAMP |
| 不支援多個 CURRENT_TIMESTAMP 預設 | 僅首個欄位生效 |
二、MySQL 5.6.6+ 新行為 (explicit_defaults_for_timestamp=ON)
[mysqld]
explicit_defaults_for_timestamp = true
| 場景 | 5.6 新行為 |
| TIMESTAMP 無 NOT NULL 聲明 | 允許 NULL,插入 NULL 存 NULL (無自動填充) |
| 首個 TIMESTAMP 無預設 | 無隱式 DEFAULT/ON UPDATE,同普通欄位 |
| NOT NULL 無預設值插入 | 嚴格模式報錯,非嚴格存 '0000-00-00' + Warning |
| 支援多個 CURRENT_TIMESTAMP | 可顯式指定多欄位 DEFAULT/ON UPDATE |
三、參數對照表
| 參數值 | 行為模式 | 適用場景 |
| OFF (0) - 預設 | 兼容 5.5 隱式行為,啟動警告 | 舊應用遷移過渡期 |
| ON (1) | 標準 SQL 行為,無隱式預設 | 新專案、追求標準相容 |
四、升級遷移實戰建議
- 審計現有表結構:
SHOW CREATE TABLE 確認 TIMESTAMP 欄位定義
- 顯式補全定義: 為所有 TIMESTAMP 欄位明確指定
DEFAULT/ON UPDATE/NULL/NOT NULL
- 測試應用相容性: 關閉隱式預設後跑測試套件
- 生產切換: 維護窗口設定參數 ON,重啟驗證
五、最佳實踐原則