首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決 MySQL 5.6 「TIMESTAMP with implicit DEFAULT value is deprecated」警告完整指南

     編輯:MySQL 資料庫相關知識

問題背景

在安裝或升級至 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 不符,且容易造成開發者誤解,因此官方決定棄用並要求顯式宣告。

快速解決方案

方法:啟用 explicit_defaults_for_timestamp

編輯 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 或零時間 無隱性預設值,嚴格模式報錯,非嚴格模式存零時間並警告

應用層面的影響與對策

  1. 建表語句需修正: 所有 CREATE TABLE 中的 TIMESTAMP 欄位應明確指定 DEFAULT、ON UPDATE、NULL/NOT NULL。
  2. ORM / 遷移工具: 檢查框架生成的 Schema 定義,確保不依賴隱性預設值。
  3. 測試驗證: 在 Staging 環境啟用參數後跑回歸測試,重點驗證時間欄位的寫入/更新邏輯。

參考資源

總結: 該警告是 MySQL 向標準 SQL 邁進的信號。只要在配置檔加入 explicit_defaults_for_timestamp=true 並補齊建表語句的顯式定義,即可平滑升級並避免未來版本的相容性問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved