線上環境中文寫入失敗,拋出 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
SHOW VARIABLES LIKE '%char%';
-- character_set_server = utf8
-- character_set_database = utf8
-- 其餘均為 utf8 或 binary

✅ 服務端編碼無問題。
修改 /etc/my.cnf 強制連接字符集:
[mysqld]
character-set-server=utf8
init-connect='SET NAMES utf8'
並在 SQLyog 中執行 SET NAMES utf8; 後插入成功,查詢顯示正常。
🔍 關鍵推論:圖形化工具(SQLyog)能正常寫入中文,說明服務端、數據庫、表、列編碼鏈路通暢,問題出在 Linux 終端交互層。
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,問題依舊。
檢查 Xshell Terminal → Encoding 發現默認非 UTF-8:

修改為 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)
本案例中:
SHOW VARIABLES LIKE '%char%' → 全鏈路 UTF-8(推薦 utf8mb4)echo $LANG / locale → zh_CN.UTF-8?characterEncoding=utf8、Python charset='utf8'、Go charset=utf8mb4最佳實踐:新建庫表統一使用 utf8mb4 + utf8mb4_general_ci,連接層強制 SET NAMES utf8mb4,終端/IDE/部署腳本全部鎖定 UTF-8,從源頭杜絕亂碼。