C#与MySQL读写中文字符避免乱码指南

竹里
竹里
发布时间:2026-10-13 | 6人浏览过
原创

在进行C#网络编程或数据库交互时,中文字符常因编码不一致导致显示为乱码。解决该问题的关键在于确保数据传输全程采用统一的Unicode编码格式,同时在MySQL数据库中配置正确的字符集类型。

核心原理与准备条件

中文字符属于多字节字符,若在网络传输或数据存储时使用非Unicode编码(如默认的ASCII),极易出现解析错误。为避免乱码,需遵循以下两个原则:

  1. 传输层:所有包含中文的字符串在转换为字节数组发送前,必须使用 Encoding.UTF8 进行编码,接收端也需使用相同的编码方式进行解码。
  2. 存储层:在MySQL数据库中,存储中文数据的字段必须使用支持Unicode的类型,如 NVARCHAR、NCHAR 或 NTEXT。

Socket通信中的中文处理

在使用TCP Socket进行C/S架构通信时,客户端与服务器均需显式指定编码方式,以确保字符串与字节流的正确转换。

第1步:服务端编码配置

服务器端在接受连接后,应使用UTF-8编码器处理收发数据。以下是标准的处理逻辑示意:

try
{
    IPAddress MyIP = IPAddress.Parse("127.0.0.1");
    TcpListener MyListener = new TcpListener(MyIP, Convert.ToInt16("1235"));
    MyListener.Start();
    Socket MySocket = MyListener.AcceptSocket();
    
    // 1. 接收并解码:使用 UTF8.GetString 防止中文乱码
    byte[] MyData = new byte[256];
    MySocket.Receive(MyData);
    // 假设 MyData 中包含有效字节,去除末尾空字节后解码
    string receivedText = System.Text.Encoding.UTF8.GetString(MyData.TakeWhile(b => b != 0).ToArray());
    this.richTextBox1.AppendText(receivedText);

    // 2. 发送并编码:将中文转为 UTF8 字节流
    string sendMessage = "From Server:你好!我是服务器";
    byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(sendMessage);
    MySocket.Send(sendBytes);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

第2步:客户端编码配置

客户端同样需要使用一致的编码策略,确保发送的中文字符串被正确序列化:

try
{
    TcpClient MyClient = new TcpClient();
    MyClient.Connect("127.0.0.1", Convert.ToInt16("1235"));
    Stream MyStream = MyClient.GetStream();
    
    // 1. 发送并编码:将含中文的字符串转为 UTF8 字节数组
    string sendText = "From Client:你好!我是客户端";
    byte[] MySendByte = System.Text.Encoding.UTF8.GetBytes(sendText);
    MyStream.Write(MySendByte, 0, MySendByte.Length);
    
    // 2. 接收并解码:读取响应字节并还原为中文
    byte[] MyData = new byte[256];
    int bytesRead = MyStream.Read(MyData, 0, 256);
    string responseText = System.Text.Encoding.UTF8.GetString(MyData, 0, bytesRead);
    this.richTextBox1.AppendText(responseText);
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

MySQL数据库中的中文存储

除了网络传输,持久化到数据库时的编码设置同样关键。在MySQL中,若字段类型未正确设置,即使传入的是正确编码的数据,也可能在保存或查询时丢失或非正常显示。

第3步:字段类型与SQL语法规范

为确保中文数据在MySQL中被完整保留,请执行以下操作:

  1. 修改表结构:将所有可能存储中文的列类型设置为 NVARCHAR、NCHAR 或 NTEXT。这些类型明确支持UTF-16/UCS-2格式的Unicode数据,兼容性优于普通的 VARCHAR。
  2. C# SQL注入防护与编码声明:虽然原草稿提到了在SQL语句中使用 N'...' 前缀来声明Unicode文本,但在现代C#开发中,强烈建议使用参数化查询以避免SQL注入风险并自动处理编码问题。

以下是安全的参数化插入示例(替代原草稿中的直接拼接):

// 假设连接字符串已配置为默认支持utf8mb4
string m_ConnectionStrings = "server=localhost;uid=xx;pwd=xx;database=db;Allow User Variables=True;";
using (SqlConnection MyConnect = new SqlConnection(m_ConnectionStrings))
{
    // 推荐使用 Parameterized Query
    string MySQL = "INSERT INTO [BSM_SystemServiceInfoTable] VALUES (@AgentID, @Col1, @Col2, @Col3, @Col0)";
    using (SqlCommand MyCommand = new SqlCommand(MySQL, MyConnect))
    {
        // 添加参数,ADO.NET 会根据 SqlDbType.NChar/NVarChar 自动处理 Unicode 编码
        MyCommand.Parameters.AddWithValue("@AgentID", AgentID);
        MyCommand.Parameters.AddWithValue("@Col1", data[1]);
        MyCommand.Parameters.AddWithValue("@Col2", data[2]);
        MyCommand.Parameters.AddWithValue("@Col3", data[3]);
        MyCommand.Parameters.AddWithValue("@Col0", data[0]);
        
        MyCommand.Connection.Open();
        MyCommand.ExecuteNonQuery();
        MyCommand.Connection.Close();
    }
}

第4步:验证数据库连接编码

在C#连接MySQL时,建议在连接字符串中显式指定字符集,例如:Default Character Set=utf8mb4。这能确保整个链路(C#驱动 -> MySQL服务 -> 磁盘存储)均使用UTF-8兼容标准,彻底消除乱码隐患。

完成判断与排错

  • 成功标志:Socket接收框中显示正常中文文本;MySQL表中查询中文数据无问号(?)或菱形乱码符号。
  • 常见错误:若仍出现乱码,首先检查数据库表属性中的“排序规则”(Collation),确保其为 utf8mb4_unicode_ci 或类似UTF-8选项,而非 latin1_swedish_ci。

简要总结

解决C#与MySQL中文乱码的核心在于“端到端的Unicode一致”。通过网络层的 Encoding.UTF8 字节流转以及数据库层的 NVARCHAR 字段类型定义,可确保中文数据在不同环境间无损传输与存储。以上就是C#与MySQL存取中文字符时避免乱码的详细内容,更多关于C#开发技巧与MySQL优化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表