Windows 遷移至 Linux 後,應用插入數據報錯:
[Err] 1366 - Incorrect integer value: '' for column 'shunxu' at row 1
INSERT INTO doc_main (..., shunxu, ...) VALUES (..., '', ...);
字段 shunxu 定義為 INT,傳入空字符串 '' 導致類型轉換失敗。
| 環境 | 默認 SQL Mode | 行為 |
|---|---|---|
| Windows (舊版/默認) | 較寬鬆 (無 STRICT_TRANS_TABLES) | 空串 → 0,發出 Warning 但寫入成功 |
| Linux (MySQL 5.7+ 默認) | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | 空串 → 報錯 1366,事務回滾 |
STRICT_TRANS_TABLES 啟用後,非法數據 (空串→數字、超範圍、截斷) 直接拋錯而非截斷警告。
確保傳入數據庫的值類型與表定義匹配:
PreparedStatement.setInt() 而非 setString()(int)$val 或 intval() 強制轉型int(val) 處理空值邏輯sql.NullInt64 處理可空整數-- 應用層邏輯示例 (PHP)
$shunxu = isset($_POST['shunxu']) && $_POST['shunxu'] !== '' ? (int)$_POST['shunxu'] : 0;
$stmt->bind_param('i', $shunxu);
ALTER TABLE `doc_main` MODIFY COLUMN `shunxu` INT NOT NULL DEFAULT 0;
NULL 時自動填 0'' 在 STRICT 模式下仍報錯,需配合應用層修正-- 會話級臨時關閉 (僅當前連接)
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
-- 全局持久化 (需重啟生效,修改 my.cnf)
[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"
風險:關閉嚴格模式會掩蓋數據質量問題,導致臟數據入庫 (如 'abc' 插入 INT 變 0),長期維護成本極高。
SHOW VARIABLES LIKE 'sql_mode'; 對比新舊環境差異setString/bind_param('s') 對應 INT 列的調用NOT NULL DEFAULT 0 (或業務默認值)| 錯誤碼 | 信息 | 典型原因 |
|---|---|---|
| 1366 | Incorrect integer value | 空串/非數字字符串插入數值列 |
| 1265 | Data truncated for column | DECIMAL/VARCHAR 超長度截斷 (非嚴格模式下 Warning) |
| 1292 | Incorrect datetime value | '0000-00-00' 插入 DATETIME (NO_ZERO_DATE 模式) |
| 1048 | Column cannot be null | NOT NULL 列傳 NULL |
嚴格模式是數據質量的守門員,遷移升級時務必對齊 SQL Mode,從源頭修正參數綁定,而非降級防線。