萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL "Out of range value for column" 錯誤:超出範圍與嚴格模式雙重解析

錯誤類型一:數值/字串超出欄位定義範圍

-- 欄位定義:a VARCHAR(10)
INSERT INTO abc (a) VALUES ('bfdsafdsafdsafdsa');  -- 16 字元 > 10

-- 錯誤
#1264 - Out of range value adjusted for column 'a' at row 1

解決:修改欄位長度 ALTER TABLE abc MODIFY a VARCHAR(20); 或應用層截斷/驗證。

錯誤類型二:自增主鍵插入空字串觸發嚴格模式

-- 表定義:id INT AUTO_INCREMENT PRIMARY KEY
INSERT INTO news (ID, Title, Content) VALUES ('', '標題', '正文');

-- MySQL 5.0.17+ 嚴格模式報錯
Out of range value adjusted for column 'ID' at row 1

原因:sql_mode 含 STRICT_TRANS_TABLES,空字串 '' 無法隱式轉為整數 0。

解決方案

方案 A:修正 SQL(推薦,根治)

-- 不寫 ID 欄位,讓自增自動生成
INSERT INTO news (Title, Content) VALUES ('標題', '正文');

-- 或顯式給 NULL/0
INSERT INTO news (ID, Title, Content) VALUES (NULL, '標題', '正文');

方案 B:放寬 sql_mode(不推薦生產)

# my.cnf / my.ini
[mysqld]
# 移除 STRICT_TRANS_TABLES
sql-mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# 重啟生效
systemctl restart mysqld

⚠️ 關閉嚴格模式會導致資料截斷、無效日期寫入成功但內容錯誤,生產環境嚴禁。

驗證當前 sql_mode

SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';

最佳實踐

  1. 應用層參數驗證:長度、型別、範圍
  2. ORM/Query Builder 自動處理自增主鍵(不傳 ID)
  3. 保持 STRICT_TRANS_TABLES 開啟,讓資料庫做最後防線
  4. 異常捕獲時記錄完整 SQL 與參數,便於定位
copyright © 萬盛學電腦網 all rights reserved