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

MySQL 5.6 TIMESTAMP 行為變更詳解:隱式預設值棄用與 explicit_defaults_for_timestamp 參數

     編輯:MySQL 資料庫相關知識

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 行為,無隱式預設新專案、追求標準相容

四、升級遷移實戰建議

  1. 審計現有表結構: SHOW CREATE TABLE 確認 TIMESTAMP 欄位定義
  2. 顯式補全定義: 為所有 TIMESTAMP 欄位明確指定 DEFAULT/ON UPDATE/NULL/NOT NULL
  3. 測試應用相容性: 關閉隱式預設後跑測試套件
  4. 生產切換: 維護窗口設定參數 ON,重啟驗證

五、最佳實踐原則

  • 🚫 不依賴資料庫隱式行為,所有預設值在建表時顯式聲明
  • 🕐 時間戳欄位建議:
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • 🔮 未來版本會移除參數,提早適應標準行為
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved