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

MySQL 中文插入報錯「Incorrect string value」徹底排查實錄

     編輯:MySQL 綜合教學

MySQL 中文插入報錯「Incorrect string value」徹底排查實錄

線上環境中文寫入失敗,拋出 Incorrect string value: '\xCC\xEC\xB2\xC5',經典的字符集不匹配問題。本文記錄從數據庫層、連接層、作業系統層、客戶端工具層四個維度的完整排查鏈路。

現象重現

INSERT INTO t SELECT 4 AS a, '第四夢' AS b;
-- ERROR 1366 (HY000): Incorrect string value: '\xCC\xEC\xB2\xC5' for column 'b' at row 1

排查步驟與證據鏈

1. 數據庫層面:字符集配置正確

SHOW VARIABLES LIKE '%char%';
-- character_set_server = utf8
-- character_set_database = utf8
-- 其餘均為 utf8 或 binary

數據庫字符集

✅ 服務端編碼無問題。

2. 連接層面:客戶端會話字符集設置

修改 /etc/my.cnf 強制連接字符集:

[mysqld]
character-set-server=utf8
init-connect='SET NAMES utf8'

並在 SQLyog 中執行 SET NAMES utf8; 後插入成功,查詢顯示正常。

🔍 關鍵推論:圖形化工具(SQLyog)能正常寫入中文,說明服務端、數據庫、表、列編碼鏈路通暢,問題出在 Linux 終端交互層。

3. 作業系統層面:Linux Locale 設置

cat /etc/sysconfig/i18n
# LANG="zh_CN.GB18030"
# SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"
# SYSFONT="lat0-sun16"

系統默認 GB18030,嘗試 export LANG="zh_CN.UTF-8" 並重啟 MySQL,問題依舊。

4. 客戶端工具層面:Xshell 終端編碼 —— 真兇現身

檢查 Xshell Terminal → Encoding 發現默認非 UTF-8:

Xshell 默認編碼

修改為 UTF-8 後:

Xshell 修改為UTF-8

再次執行插入 —— 成功!

INSERT INTO t SELECT 4 AS a, '第四夢' AS b;
-- Query OK, 1 row affected

插入成功

核心原理:三層編碼必須一致

MySQL 字符集轉換鏈路:

客戶端發送字節 → character_set_client → 服務端解碼
                    ↓
            character_set_connection
                    ↓
            內部操作 (character_set_server)
                    ↓
            存儲 (character_set_database/table/column)

本案例中:

  • 服務端/數據庫/表/列:UTF-8
  • SQLyog 客戶端:自動協商 UTF-8 ✅
  • Xshell 終端:默認 GBK/ANSI ❌ → 發送 GBK 字節流 → 服務端按 UTF-8 解碼失敗 → 報錯

排查清單(下次直達現場)

  1. 客戶端工具編碼:Xshell/Putty/SecureCRT 終端設置 → UTF-8
  2. 數據庫字符集:SHOW VARIABLES LIKE '%char%' → 全鏈路 UTF-8(推薦 utf8mb4)
  3. Linux 系統 Locale:echo $LANG / locale → zh_CN.UTF-8
  4. 應用程序連接字符串:JDBC ?characterEncoding=utf8、Python charset='utf8'、Go charset=utf8mb4

最佳實踐:新建庫表統一使用 utf8mb4 + utf8mb4_general_ci,連接層強制 SET NAMES utf8mb4,終端/IDE/部署腳本全部鎖定 UTF-8,從源頭杜絕亂碼。

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