如何正确配置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
相关产品推荐
相关产品推荐

