You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确配置EF Core与SQL Server字符集/编码?解决字符读取异常

EF Core 6.0.5读取SQL Server中Ó字符乱码的解决办法

问题根因

Ó读取后显示为A“是编码转换不匹配导致的:

  • 你的数据库排序规则SQL_Latin1_General_CP1_CI_AS基于CP1252编码,Ó在CP1252中是单字节0xD3;
  • 系统默认用UTF-8编码,若连接时未正确处理Unicode与CP1252的映射,驱动会把0xD3错误解析为UTF-8无效序列,进而显示乱码;
  • ã、ç等字符在CP1252和UTF-8的单字节表示兼容,因此未出现问题。

解决方案

1. 修正连接字符串参数

确保SQL Server连接字符串显式声明Unicode支持和UTF-8编码(Microsoft.Data.SqlClient驱动默认UseUnicode=true,但显式设置可避免隐式错误):

Server=your_server_address;Database=your_db_name;User Id=your_user;Password=your_pass;UseUnicode=true;CharacterSet=utf8;
  • UseUnicode=true:强制驱动以Unicode协议与SQL Server交互,适配nvarchar列的Unicode存储特性;
  • CharacterSet=utf8:指定驱动与应用间的传输编码为UTF-8,匹配系统默认编码。

2. 验证数据存储有效性

先在SQL Server中执行查询,确认Ó是否被正确存储为Unicode:

SELECT UNICODE(your_column) AS Unicode_Code FROM your_table WHERE your_column LIKE '%Ó%'
  • 返回值应为211(对应Unicode码位U+00D3),说明存储正常;
  • 若返回211但读取仍乱码,问题出在连接/应用层编码;
  • 若返回值不是211,说明数据插入时未按Unicode写入,需重新插入时确保用UTF-8或Unicode编码处理字符串。

3. 确保EF Core实体配置正确

在实体类中显式指定字段对应SQL Server的nvarchar类型,避免EF Core隐式映射为非Unicode类型:

using System.ComponentModel.DataAnnotations.Schema;

public class YourEntity
{
    // 显式指定列类型为nvarchar
    [Column(TypeName = "nvarchar(255)")]
    public string ProblemField { get; set; }
}

4. 排查应用内编码转换逻辑

检查代码中是否有手动转换编码的逻辑,确保所有字符串读写都使用UTF8Encoding,避免混用Encoding.Default(部分环境下Encoding.Default对应CP1252):

// 错误示例:使用系统默认编码
var wrongBytes = Encoding.Default.GetBytes("Ó");
// 正确示例:明确使用UTF-8
var correctBytes = Encoding.UTF8.GetBytes("Ó");

内容的提问来源于stack exchange,提问作者dinhokz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:45:26