ERROR 1265 (01000): Data truncated for column 'col_name' at row 1
-- 或警告模式
Warning 1265: Data truncated for column 'col_name' at row 1
| 場景 | 典型案例 | 根因 |
|---|---|---|
| 字符串過長 | VARCHAR(10) 插入 15 個字符 | 超過定義長度,嚴格模式報錯,非嚴格模式截斷並警告 |
| 數值溢出 | TINYINT UNSIGNED (0~255) 插入 300 | 超出類型範圍 |
| 小數精度溢出 | DECIMAL(5,2) 插入 1234.56 (整數部超過 3 位) | 整數部分超過 M-D 位 |
| 日期時間格式/範圍 | DATE 插入 '2024-13-01' / TIMESTAMP 插入 '1969-01-01' | 非法日期、超出類型範圍 (TIMESTAMP 1970~2038) |
| 枚舉/集合非法值 | ENUM('a','b') 插入 'c' | 不在定義集合中 |
| 字符集不匹配 | CHARSET latin1 列插入 Emoji (需 4 字節) | 字符集不支援字符導致截斷/報錯 |
-- 查看當前模式
SELECT @@sql_mode;
-- 嚴格模式 (5.7+ 預設開啟 STRICT_TRANS_TABLES)
-- 行為:報錯、回滾事務、數據不入庫
-- 非嚴格模式
-- 行為:截斷數據、寫入截斷後值、產生 Warning、事務繼續
SHOW WARNINGS; (緊跟失敗語句執行)SHOW CREATE TABLE t; 檢查列類型、長度、字符集-- 擴大長度
ALTER TABLE t MODIFY COLUMN col VARCHAR(500) CHARSET utf8mb4;
-- 修正數值類型
ALTER TABLE t MODIFY COLUMN col INT UNSIGNED;
-- 升級字符集支援 Emoji
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
// Java 範例
public String safeSubstring(String input, int maxLen) {
if (input == null) return null;
// 按字符數截斷 (非字節),避免截斷多字節字符產生亂碼
return input.length() <= maxLen ? input : input.substring(0, maxLen);
}
// 插入前驗證
if (value > 255) throw new IllegalArgumentException("Value exceeds TINYINT UNSIGNED range");
-- 會話級關閉嚴格模式
SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');
SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_ALL_TABLES', '');
-- 全域 (需重啟生效 my.cnf)
[mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION # 僅保留必要模式
@Size, @Max, @Pattern)SHOW WARNINGS 入庫、日誌告警「Data truncated」關鍵字Data truncated for column 本質是「數據不匹配定義」。嚴格模式下是硬錯誤保護數據質量;非嚴格模式下是隱性數據損壞源頭。解決路徑優先級:**修正定義 (DDL) > 應用層驗證 > 關閉嚴格模式**。建立「Schema 變更評審 + 應用驗證雙層 + Warning 監控」三道防線,從源頭杜絕截斷風險。