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

C# 連接 MySQL 中文亂碼根因與解決:character_set_client/connection/results 三層協商機制

     編輯:MySQL 綜合教學

C# MySQL 亂碼本質:四層編碼流水線任一環節不匹配即失敗

數據流向:


C# 字串(UTF-16) → Connector/NET → client(UTF-8) → connection(Server端編碼) → Server存儲 → connection → results → Client讀取

關鍵 Session 變量

現象復現


// my.cnf 已設置 default-character-set=utf8
// 但未執行 SET NAMES,查詢顯示:
character_set_client = latin1
character_set_connection = latin1
character_set_results = latin1
// 寫入中文 → 讀出 ??? 或亂碼

解決方案:連接打開後立即執行


// MySqlConnector / MySql.Data 通用
using (var conn = new MySqlConnection(connStr)) {
    conn.Open();
    using (var cmd = conn.CreateCommand()) {
        cmd.CommandText = "SET NAMES utf8mb4";  // 等同於同時設置 client/connection/results = utf8mb4
        cmd.ExecuteNonQuery();
    }
    // 後續操作正常
}

為什麼 SET NAMES utf8mb4 有效?

等同於:


SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

將三層統一為 utf8mb4,與 C# 字串 (UTF-16 → Connector 自動轉 UTF-8) 完美對接。

進階:連接字串參數化 (推薦)


var connStr = "Server=localhost;Database=test;Uid=user;Pwd=pass;CharSet=utf8mb4;";
// MySqlConnector 支持 CharSet 參數,自動執行 SET NAMES
// MySql.Data 老版本可能不支持,需手動執行

服務端配置 (my.cnf) 輔助


[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'  -- 非超級用戶連接自動執行

注意:init_connect 對 SUPER 權限用戶 (如 root) 不生效,應用賬號勿給 SUPER。

避坑清單

  1. C# 源文件保存為 UTF-8 無 BOM (VS 默認 UTF-8 with BOM 可能導致 BOM 字符進入 SQL)。
  2. 資料庫/表/欄位字符集統一 utf8mb4 (支援 Emoji、生僻字)。
  3. Connector/NET 版本 ≥ 6.10 (支援 utf8mb4),舊版本僅支援 utf8 (BMP)。
  4. 連接池復用時,SET NAMES 需在 Open() 後每次執行,或用連接字串 CharSet 參數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
變量角色默認值 (未顯式設置時)
character_set_clientClient 發送 SQL 的編碼latin1
character_set_connectionServer 接收後轉換目標編碼latin1
character_set_results結果集返回 Client 的編碼latin1
character_set_serverServer 默認存儲編碼latin1/utf8
character_set_database當前庫默認編碼依建庫指定