在安裝或升級至 MySQL 5.6 版本時,常會在啟動日誌或 mysql_install_db 輸出中看到以下警告:
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
此警告雖不影響服務啟動,但預示著未來版本將移除舊有的隱性預設行為,建議盡早處理。
MySQL 5.6.6 之前,TIMESTAMP 欄位擁有下列「魔法」預設行為:
NULL 時預設為 NOT NULL,寫入 NULL 自動轉為當前時間戳記。TIMESTAMP 欄位自動獲得 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。'0000-00-00 00:00:00',且不發出警告。這些行為與標準 SQL 不符,且容易造成開發者誤解,因此官方決定棄用並要求顯式宣告。
編輯 my.cnf(Windows 為 my.ini),在 [mysqld] 區段加入:
[mysqld] explicit_defaults_for_timestamp=true
重啟 MySQL 服務後警告即會消失。
| 場景 | 舊版行為 (5.6.6 前) | 新版行為 (啟用參數後) |
|---|---|---|
| 未宣告 NULL 的 TIMESTAMP | 預設 NOT NULL,寫 NULL 存當前時間 | 允許 NULL,寫 NULL 存 NULL |
| 第一個 TIMESTAMP 欄位 | 自動加 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 不再自動加,需顯式指定 |
| NOT NULL 但無 DEFAULT | 隱性預設為 CURRENT_TIMESTAMP 或零時間 | 無隱性預設值,嚴格模式報錯,非嚴格模式存零時間並警告 |
CREATE TABLE 中的 TIMESTAMP 欄位應明確指定 DEFAULT、ON UPDATE、NULL/NOT NULL。總結: 該警告是 MySQL 向標準 SQL 邁進的信號。只要在配置檔加入
explicit_defaults_for_timestamp=true並補齊建表語句的顯式定義,即可平滑升級並避免未來版本的相容性問題。