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

MySQL 5.x 升級 5.7 後導入舊資料 DATE/TIMESTAMP 報錯快速修復

     編輯:MySQL 資料庫相關知識

MySQL 5.7 預設啟用嚴格 SQL 模式(STRICT_TRANS_TABLES、NO_ZERO_DATE、NO_ZERO_IN_DATE),導入 5.5/5.6 時代允許的「零日期」(0000-00-00)或無效日期會直接報錯。快速修復:調整 sql_mode 移除嚴格項。

Linux 修改 my.cnf

# 典型路徑
/etc/my.cnf
/usr/local/mysql/etc/my.cnf

# 找到並註釋/刪除
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 或完整嚴格模式
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Windows 修改 my.ini

  • 32 位:安裝目錄下 my.ini
  • 64 位:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini(隱藏資料夾)
# 搜尋並註釋/刪除
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

生效方式

# Linux
systemctl restart mysqld

# Windows
net stop mysql57 && net start mysql57
# 或服務管理器重啟

建議的生產 sql_mode(兼容舊資料)

sql_mode = "NO_ENGINE_SUBSTITUTION"
# 僅保留引擎替換防護,移除所有嚴格日期/分組/除零檢查

長期治理建議

  1. 升級前用 pt-upgrade 或自寫腳本掃描 0000-00-00、NULL 違規資料
  2. 資料清洗:UPDATE t SET dt=NULL WHERE dt='0000-00-00'
  3. 應用層修正:寫入前驗證日期有效性
  4. 逐步收緊 sql_mode 至推薦嚴格模式
快速修復 ≠ 根治。上線前務必完成資料清洗與應用驗證,避免「零日期」在 5.7+ 成定時炸彈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved