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

C# 與 MySQL 中文存取防亂碼指南:Unicode 編碼全鏈路實踐

     編輯:MySQL 綜合教學

C# 與 MySQL 中文存取防亂碼指南:Unicode 編碼全鏈路實踐

網絡通訊與數據庫存取中文亂碼是 C# 開發常見痛點。核心原則:**全鏈路統一使用 Unicode (UTF-16/UTF-8) 編碼**。本文通過 Socket 通訊與 SQL Server/MySQL 存取示例,演示正確處理姿勢。

一、Socket 通訊:發送接收必須用 Unicode

中文字符佔 2 字節,直接用默認編碼發送會產生亂碼。正確做法:發送前 Encoding.Unicode.GetBytes(),接收後 Encoding.Unicode.GetString()。

服務端

try {
  IPAddress MyIP = IPAddress.Parse("127.0.0.1");
  TcpListener MyListener = new TcpListener(MyIP, 1235);
  MyListener.Start();
  Socket MySocket = MyListener.AcceptSocket();
  byte[] MyData = new byte[256];
  MySocket.Receive(MyData);
  this.richTextBox1.AppendText(Encoding.Unicode.GetString(MyData));
  UnicodeEncoding MyInfo = new UnicodeEncoding();
  MySocket.Send(MyInfo.GetBytes("From Server:你好!我是服務器"));
} catch (Exception ex) { MessageBox.Show(ex.Message); }

客戶端

try {
  TcpClient MyClient = new TcpClient();
  MyClient.Connect("127.0.0.1", 1235);
  Stream MyStream = MyClient.GetStream();
  UnicodeEncoding MyInfo = new UnicodeEncoding();
  byte[] MySendByte = MyInfo.GetBytes("From Client:你好!我是客戶端");
  MyStream.Write(MySendByte, 0, MySendByte.Length);
  byte[] MyData = new byte[256];
  MyStream.Read(MyData, 0, 256);
  this.richTextBox1.AppendText(Encoding.Unicode.GetString(MyData));
} catch (Exception ex) { MessageBox.Show(ex.Message); }

二、SQL Server 存取:N 前綴 + nchar/nvarchar/ntext

SQL 腳本中字符串參數加 N 前綴聲明 Unicode,對應列類型必須為 nchar/nvarchar/ntext(n 代表 National/Unicode)。

string MySQL = string.Format(
  "INSERT INTO [BSM_SystemServiceInfoTable] VALUES ({0}, N'{1}', N'{2}', N'{3}', N'{4}')",
  AgentID, data[1], data[2], data[3], data[0]);
SqlCommand MyCommand = new SqlCommand(MySQL, MyConnect);
MyCommand.Connection.Open();
MyCommand.ExecuteNonQuery();
MyCommand.Connection.Close();

三、MySQL 存取:連接字符串指定 Charset

MySQL 不需要 N 前綴,但要求連接層指定字符集。MySqlConnector / MySql.Data 驅動均支持連接字符串參數:

MySQLConnection con = new MySQLConnection(
  "server=127.0.0.1;uid=root;pwd=;database=test;Charset=utf8");

或使用 Character Set=utf8mb4(推薦,支持 Emoji)。

四、全鏈路檢查清單

環節關鍵設置
C# 字符串原生 Unicode (UTF-16),無需額外處理
網絡發送/接收Encoding.Unicode / UTF8.GetBytes/GetString
MySQL 連接字符串Charset=utf8mb4
MySQL 表/列字符集CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
SQL Server 列類型nchar/nvarchar/ntext + 參數加 N 前綴
控制台/日誌輸出終端編碼設置為 UTF-8

總結

「全鏈路 Unicode」是防亂碼鐵律。C# 內部已是 Unicode,關鍵在於跨邊界(網絡、數據庫)時顯式指定編碼。MySQL 推薦 utf8mb4,SQL Server 用 N'...' + nvarchar,Socket 通訊統一 Encoding.Unicode。

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