萬盛學電腦網

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

MySQL Incorrect integer value 錯誤解決:嚴格模式下空值插入規範與兼容配置

錯誤現象

Incorrect integer value: '' for column 'id' at row 1

向整型列插入空字符串 '' 觸發,MySQL 5.0+ 嚴格模式默認開啟。

根因

  • SQL 模式含 STRICT_TRANS_TABLES:嚴格類型檢查
  • 整型列不接受空字符串,需顯式 NULL 或數值
  • 舊版本/非嚴格模式下隱式轉換為 0

三種解決路徑

1. 代碼層面規範化(根治、推薦)

-- 錯誤
INSERT INTO test VALUES('', $val, '');

-- 正確:自增主鍵不寫或寫 NULL
INSERT INTO test (col1, col2) VALUES($val, 'text');
-- 或
INSERT INTO test VALUES(NULL, $val, 'text');
-- 或
INSERT INTO test VALUES(DEFAULT, $val, 'text');

所有數值類型列:空值用 NULL,自增用 DEFAULT 或省略。

2. 會話級關閉嚴格模式(臨時兼容)

SET SESSION sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

僅當前連接生效,斷開失效。

3. 全局配置文件永久關閉(不推薦生產)

[mysqld]
sql-mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# 移除 STRICT_TRANS_TABLES, STRICT_ALL_TABLES

重啟生效。副作用:數據質量下降,非法數據靜默截斷/轉換。

虛擬主機/無權修改配置場景

唯一出路:修正應用代碼,所有數值字段插入前判空轉 NULL。

驗證

SHOW VARIABLES LIKE 'sql_mode';
INSERT INTO test (id) VALUES (NULL);  -- 成功
INSERT INTO test (id) VALUES ('');     -- 失敗 (嚴格模式下)

最佳實踐

  1. 保持 STRICT_TRANS_TABLES 開啟,保障數據質量
  2. ORM/DBAL 層統一處理空值轉 NULL
  3. 表結構定義 DEFAULT NULL 或 DEFAULT 0 明確默認值
  4. 遷移舊數據時先清洗再導入
copyright © 萬盛學電腦網 all rights reserved