安裝 MySQL 5.6 時常遇到以下警告:
[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 列的隱式默認行為被標記為廢棄。舊版本(5.6.6 前)默認行為:
NOT NULL,賦值 NULL 會自動存為當前時間戳。DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP。'0000-00-00 00:00:00'。這種「詭異」的隱式行為易導致遷移兼容性問題,故 5.6 廢棄並提示警告。
在配置文件 my.cnf 的 [mysqld] 節點添加:
[mysqld] explicit_defaults_for_timestamp=true
重啟 MySQL 後警告消失,TIMESTAMP 行為變為標準化:
NOT NULL 時允許 NULL,無自動填充行為。DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP。NOT NULL 但無默認值的列,嚴格 SQL 模式下插入不賦值報錯;非嚴格模式下存 '0000-00-00 00:00:00' 並警告(同 DATETIME 行為一致)。explicit_defaults_for_timestamp 即「顯式指定 TIMESTAMP 列的默認值」。開啟後,若需保留自動時間戳特性,必須在建表時顯式聲明:
CREATE TABLE t ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
這樣既消除了警告,又讓行為更可控、可移植,建議所有 5.6+ 部署均開啟此參數。