首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 字符集編碼不匹配導致「Data too long」錯誤的排查與解決

     編輯:MySQL 綜合教學

問題現象

數據庫字符集設置為 utf-8,但在 Windows 命令行下向表中插入漢字時,報錯:

ERROR 1406 (22001): Data too long for column 'name' at row 1

根因分析

核心原因:Windows 控制台(CMD/PowerShell)默認使用 GBK(代碼頁 936)編碼,而 MySQL 服務端期望接收 utf-8 編碼的數據。當客戶端以 GBK 發送多字節漢字(每字 2 字節),服務端按 UTF-8 解析(每字 3 字節),導致字節長度計算錯誤,觸發「超過列定義長度」報錯。

字符集不匹配示意圖

解決方案

方案一:會話級臨時設置(推薦臨時測試)

mysql> SET NAMES gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t(name) VALUES('測試');
Query OK, 1 row affected (0.01 sec)
  • 僅對當前連接生效,斷開重連失效。
  • 適用於臨時在 CMD 下手工插入測試數據。

方案二:修改配置文件永久生效(推薦開發環境統一)

  1. 定位 MySQL 配置文件:
      Windows:my.ini(通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server 5.x\)
      Linux:/etc/my.cnf 或 /etc/mysql/my.cnf
  2. 修改 [mysql] 及 [client] 區塊:
    [client]
    default-character-set=gbk
    
    [mysql]
    default-character-set=gbk
    
  3. 重啟 MySQL 服務:
      Windows:net stop mysql && net start mysql
      Linux:systemctl restart mysqld
  4. 之後所有客戶端連接默認使用 GBK 編碼與服務端交互,避免編碼轉換錯誤。

    最佳實踐建議

    1. 統一編碼鏈路:建議「數據庫、表、列、連接、應用程式」全鏈路統一使用 utf8mb4,避免編碼轉換帶來的各類坑。
    2. 客戶端工具設置:Navicat、DataGrip、MySQL Workbench 等 GUI 工具均可在連接屬性中顯式指定字符集,優先於配置文件生效。
    3. 應用層連接池配置:Java (Druid/HikariCP) 設置 connectionInitSqls: SET NAMES utf8mb4;Python (PyMySQL) 連接時指定 charset='utf8mb4';Go (go-sql-driver) DSN 追加 ?charset=utf8mb4。
    4. 避免修改服務端 character_set_server:將服務端改為 GBK 會導致存儲的非中文字符(如 Emoji、生僻字)丟失,不推薦。

    驗證命令

    -- 查看當前連接字符集
    SHOW VARIABLES LIKE 'character_set_%';
    
    -- 查看表實際字符集
    SHOW CREATE TABLE t\G
    
    -- 測試插入
    INSERT INTO t(name) VALUES('測試😀');
    SELECT name, HEX(name), CHAR_LENGTH(name), LENGTH(name) FROM t;
    

    若 HEX 顯示正確的 UTF-8 字節序列,且 CHAR_LENGTH(字符數)與預期一致,則編碼鏈路正常。

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