首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 中文插入異常:「data too long」與 sql_mode 嚴格模式關係

     編輯:程式設計綜合問答

問題現象

MySQL 資料表插入中文報 Data too long for column,僅「女」字能插入。註釋 my.ini 中 sql_mode=STRICT_TRANS_TABLES... 後 DOS 下可插入,但 MyEclipse 仍報錯。

根本原因分析

  1. 字元集不匹配:資料表/欄位字元集(如 latin1)與連線字元集(如 utf8/utf8mb4)不一致,導致位元組長度計算錯誤。一個 UTF-8 中文 3 位元組,若欄位定義 VARCHAR(10) 按字元計算卻按位元組存儲,極易超長。
  2. STRICT_TRANS_TABLES:嚴格模式下,資料截斷會直接報錯而非警告截斷。關閉後 MySQL 默默截斷,看似「成功」實則資料損壞。
  3. 連線層字元集:MyEclipse (JDBC) 與 DOS (mysql client) 可能使用不同連線字元集(characterEncoding 參數),導致行為不一致。

徹底解決方案

1. 統一全鏈路字元集為 utf8mb4(推薦)

-- 資料庫/資料表/欄位
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 欄位長度按字元語意
ALTER TABLE mytable MODIFY col VARCHAR(100) CHARACTER SET utf8mb4;

-- JDBC 連線字串
jdbc:mysql://host:3306/mydb?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC

2. 保留嚴格模式,修正資料長度

不要關閉 STRICT_TRANS_TABLES,它是資料完整性守門員。改為:

  • 欄位定義足夠長度(按字元 VARCHAR(n CHAR) 或改用 TEXT)。
  • 應用層驗證輸入長度,友善提示而非靠資料庫報錯。

3. 驗證連線字元集

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

確保 character_set_client、connection、results、database 皆為 utf8mb4。

常見誤區

  • 以為關閉嚴格模式解決問題:實則掩蓋資料截斷風險,生產環境極度危險。
  • 混淆 utf8 與 utf8mb4:MySQL utf8 實為 utf8mb3,不支援 Emoji/罕見字,務必用 utf8mb4。
  • 忽略 JDBC 連線參數:characterEncoding 與 useUnicode 必須顯式指定。

最佳實踐清單

  1. 資料庫/表/欄位全链路 utf8mb4 + utf8mb4_unicode_ci。
  2. 欄位長度用 CHAR 語意(VARCHAR(100 CHAR))或改 TEXT。
  3. JDBC 連線字串加 characterEncoding=utf8&useUnicode=true。
  4. 保留 STRICT_TRANS_TABLES,應用層做長度校驗。
  5. 使用連線池(HikariCP)統一管理連線屬性。

字元集不一致是中文亂碼/截斷的萬惡之源,統一全鏈路 utf8mb4 才是正解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved