遷移資料庫後執行 INSERT 報錯:
[Err] 1366 - Incteger integer value: '' for column 'shunxu' at row 1
原因:欄位 shunxu INT 預設值為 NULL,但應用傳入空字串 '',MySQL 嚴格模式 (STRICT_TRANS_TABLES) 拒絕隱式轉換。
ALTER TABLE doc_main MODIFY shunxu INT NOT NULL DEFAULT 0;
或僅改預設值:
ALTER TABLE doc_main ALTER shunxu SET DEFAULT 0;
重啟 MySQL 服務使生效 (視版本而定,通常動態生效)。
SELECT @@SQL_MODE; -- 5.7+ 預設含: STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION -- 5.6 或舊版可能未啟用 STRICT_TRANS_TABLES,允許 '' → 0 隱式轉換
| 策略 | 做法 | 優點 | 缺點 |
|---|---|---|---|
| 修正資料結構 (推薦) | NOT NULL DEFAULT 0 + 應用層傳入數值 | 資料品質高、符合嚴格模式 | 需變更 DDL、應用同步調整 |
| 寬鬆 SQL_MODE | 移除 STRICT_TRANS_TABLES | 零代碼變更、快速相容舊應用 | 掩蓋資料品質問題、非長久之計 |
| 應用層轉換 | 空字串轉 NULL 或 0 再傳入 | 不動資料庫、邏輯集中 | 需修改所有寫入路徑 |
[mysqld] sql_mode = "NO_ENGINE_SUBSTITUTION" # 僅保留必要項,移除 STRICT_TRANS_TABLES
重啟後生效。生產環境建議保持嚴格模式,在應用層修正輸入。