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

C# 連接 MySQL 中文亂碼徹底解決:字元集鏈路、SET NAMES、連接字串與驅動版本陷阱

     編輯:MySQL 綜合教學

亂碼根因:字元集轉換鏈路斷裂

資料流向:Client → Connection → Server → Storage 及反向。每個環節皆有字元集設定,任一不一致即產生亂碼。

環節系統變數預設值建議值
客戶端發送character_set_clientlatin1utf8mb4
連線轉換character_set_connectionlatin1utf8mb4
伺服器內部character_set_serverlatin1utf8mb4
結果集返回character_set_resultslatin1utf8mb4
資料庫預設character_set_databaselatin1utf8mb4
系統識別符character_set_systemutf8utf8

解決方案:連線建立後立即執行 SET NAMES


using (var conn = new MySqlConnection(connStr))
{
    conn.Open();
    // 關鍵:統一客戶端/連線/結果集字元集
    using (var cmd = new MySqlCommand("SET NAMES utf8mb4", conn))
    {
        cmd.ExecuteNonQuery();
    }
    // 後續所有操作均在 utf8mb4 環境下進行
    ...
}

SET NAMES utf8mb4 等同於:


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

連接字串參數化(MySql.Data 8.0+ 推薦)


var builder = new MySqlConnectionStringBuilder
{
    Server = "1.2.3.4",
    Port = 3306,
    Database = "mydb",
    UserID = "dev",
    Password = "pass",
    CharacterSet = "utf8mb4",      // 設定 character_set_client/connection/results
    SslMode = MySqlSslMode.None,   // 開發環境
    ConnectionTimeout = 30,
    DefaultCommandTimeout = 60,
};
// builder 自動產生包含 CharSet=utf8mb4 的連接字串
// 但仍建議連線後額外執行 SET NAMES utf8mb4 以防驅動行為差異

資料庫/表/欄位字元集統一


-- 建庫
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 建表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修正既有表
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

驅動版本陷阱:MySql.Data 6.x vs 8.x

  • 6.x 系列:預設字元集 utf8(僅支援 BMP,無 Emoji),CharSet=utf8 對應 utf8mb3
  • 8.x 系列:預設 utf8mb4,完整支援 Unicode,CharSet=utf8 映射為 utf8mb4
  • 遷移建議:全面升級 8.x,連接字串統一 CharacterSet=utf8mb4

完整檢查清單

  1. [ ] MySQL 伺服器 character_set_server = utf8mb4
  2. [ ] 資料庫/表/欄位 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
  3. [ ] 連接字串 CharacterSet=utf8mb4 (或 CharSet=utf8mb4)
  4. [ ] 連線開啟後 **立即** 執行 SET NAMES utf8mb4
  5. [ ] 程式碼檔案儲存為 **UTF-8 無 BOM** (Visual Studio: File → Advanced Save Options)
  6. [ ] 輸出頁面/介面 <meta charset="utf-8"> / Console Encoding.UTF8
  7. [ ] 參數化查詢(Parameters.AddWithValue),**拒絕字串拼接 SQL**

進階:Connection String Builder 擴充方法


public static class MySqlConnectionExtensions
{
    public static MySqlConnection OpenWithUtf8(this MySqlConnection conn)
    {
        conn.Open();
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci";
            cmd.ExecuteNonQuery();
        }
        return conn;
    }
}

// 使用
using (var conn = new MySqlConnection(builder.ConnectionString).OpenWithUtf8())
{
    // 安全執行中文查詢
}

常見誤區

中文亂碼本質是**字元集協議不匹配**。解決核心:**全鏈路 utf8mb4 + 連線即 SET NAMES + 參數化查詢 + UTF-8 原始碼檔**。一次配置,永久免疫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
誤區正確認知
只設連接字串 CharSet 即可驅動版本行為不一,**必須加 SET NAMES** 雙重保險
utf8 等於 utf8mb4MySQL utf8 = utf8mb3(3 位元組),**Emoji/生僻字需 utf8mb4**
資料庫預設 utf8mb4 就夠了連線層字元集獨立,**必須 SET NAMES**
亂碼只能靠程式碼轉碼修補源頭修正字元集鏈路,杜絕事後轉碼