全部產品
Search
文件中心

ApsaraDB RDS:RDS MySQL寫入資料報錯Error 1406: Data too long for column

更新時間:Jul 18, 2025

問題描述

在RDS MySQL資料庫中寫入資料時,出現如下報錯:

Error 1406: Data too long for column 'xxx'

問題原因

  • 欄位長度限制

    當表結構中定義的欄位為字元類型(如CHARVARCHAR),並且指定了最大長度限制時,如果寫入的資料長度超過該限制,則會觸發此錯誤。

  • sql_mode模式影響

    sql_mode的配置決定了MySQL對超出欄位長度資料的處理方式:

    • 當MySQL資料庫啟用了strict 模式(STRICT_TRANS_TABLESSTRICT_ALL_TABLES),如果寫入的資料超出欄位定義的長度限制,MySQL會直接報錯並拒絕寫入。

    • 當MySQL資料庫未啟用strict 模式,MySQL允許寫入超出長度限制的資料,但會截斷超出部分,並記錄警告資訊,此時資料並不完整。

  • 用戶端差異導致報錯表現不同

    不同用戶端可能設定了不同的sql_mode值,且不同用戶端寫入的資料長度不同,只有超出欄位定義長度的寫入才會觸發問題。例如:

    • 用戶端A啟用了strict 模式,寫入超長資料會報錯。

    • 用戶端B未啟用strict 模式,寫入超長資料會被截斷且不報錯,但資料並不完整。

樣本如下:

-- 建立表t1,包含兩個欄位id(主鍵,類型為INT,不可為空)、name(類型為VARCHAR,最大長度為5個字元)。
CREATE TABLE t1 (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(5)
);
-- 輸出:Query OK, 0 rows affected (0.01 sec)


-- 查看當前資料庫的SQL模式(sql_mode),sql_mode決定了MySQL的行為模式,例如是否啟用strict 模式。
SHOW VARIABLES LIKE 'sql_mode';
-- 輸出:返回STRICT_TRANS_TABLES表示啟用了strict 模式。
-- +---------------+-----------------------------------------------------------------------------------------------------------------------+
-- | Variable_name | Value                                                                                                                 |
-- +---------------+-----------------------------------------------------------------------------------------------------------------------+
-- | sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
-- +---------------+-----------------------------------------------------------------------------------------------------------------------+
-- 1 row in set (0.00 sec)


-- 嘗試插入一條資料,其中name欄位的值為'aaaaaa'(6個字元),超出欄位定義的最大長度(5個字元)。
INSERT INTO t1 VALUES (1, 'aaaaaa');
-- 輸出:ERROR 1406 (22001): Data too long for column 'name' at row 1
-- 原因:由於啟用了strict 模式 (STRICT_TRANS_TABLES),MySQL報錯並拒絕插入超出長度限制的資料。


-- 查詢表t1的內容,確認是否成功插入資料。
SELECT * FROM t1;
-- 輸出:Empty set (0.00 sec)
-- 原因:由於上一步插入失敗,因此表中沒有資料。

解決方案

  • 調整欄位長度(推薦)

    修改表結構,增加欄位的長度限制,以適配寫入資料的最大長度需求。例如:

    ALTER TABLE t1 MODIFY COLUMN name VARCHAR(10);
  • 調整sql_mode模式(不推薦)

    如果無法修改表結構,可以通過調整 sql_mode 參數來禁用strict 模式規避報錯。禁用strict 模式後,寫入超長資料不會報錯,但超出部分會被截斷,可能導致資料不完整。由於該方法存在資料丟失風險,因此僅適用於臨時調試或非關鍵業務情境。例如:

    -- 去掉STRICT_TRANS_TABLES嚴格事務模式
    mysql> set sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    -- 再次插入超出欄位定義長度的資料可以插入成功,但MySQL用戶端寫入可以看到有warning提示
    mysql> insert into t1 values (2,'aaaaaa');
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    -- warning提示中顯示name欄位資料被截斷了
    mysql> show warnings;
    +---------+------+-------------------------------------------+
    | Level   | Code | Message                                   |
    +---------+------+-------------------------------------------+
    | Warning | 1265 | Data truncated for column 'name' at row 1 |
    +---------+------+-------------------------------------------+
    1 row in set (0.00 sec)

  • 統一用戶端sql_mode配置

    確保所有用戶端使用一致的sql_mode配置,避免因用戶端差異導致的行為不一致。

使用建議

建議您開啟SQL洞察和審計功能,以便記錄執行失敗的SQL語句。

審計頁面中,您可以通過勾選執行狀態失敗來篩選出執行失敗的SQL記錄,失敗的SQL會展示在頁面下方的日誌列表中,狀態列除了展示SQL執行失敗外,還會記錄失敗碼,您還可根據錯誤碼檢索失敗原因

image

適用於

RDS MySQL