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

ASP.NET Core与SQL Server编码问题求助

解决俄语字符存入SQL Server后显示???的问题

嗨,我来帮你搞定这个俄语字符变成???的麻烦事儿~从你描述的情况来看,调试时数据正常但存入数据库就乱码,大概率是Unicode字符支持的环节出了问题,咱们一步步排查解决:

1. 检查数据库字段的类型是否支持Unicode

SQL Server里,普通的varchar/char类型只支持ASCII和部分单字节字符,俄语属于多字节的Unicode字符,必须用Unicode专属类型:

  • 推荐用nvarchar(n)(n是字符长度,比如nvarchar(255))或者nvarchar(max)(存储长文本)
  • 避免用varchar、char、ntext(ntext已被官方淘汰)

如果字段现在是varchar,可以用SQL语句修改:

ALTER TABLE YourTableName ALTER COLUMN YourColumnName nvarchar(255) NULL;
-- 根据实际需求调整长度和是否允许为空

2. 插入数据时必须指定Unicode前缀或用参数化查询

这是最容易踩坑的点:

  • 如果直接拼接SQL语句,必须在俄语字符串前加N前缀,告诉SQL Server这是Unicode字符串:
    INSERT INTO YourTable (RussianText) VALUES (N'Привет, мир!'); -- 注意前面的N
    
  • 更推荐用参数化查询(既避免SQL注入,又能保证编码正确),以C#为例:
    using (var connection = new SqlConnection("你的数据库连接字符串"))
    {
        connection.Open();
        var sql = "INSERT INTO YourTable (RussianText) VALUES (@rusText)";
        using (var cmd = new SqlCommand(sql, connection))
        {
            // 指定参数类型为NVarChar,确保传递Unicode字符
            cmd.Parameters.Add("@rusText", SqlDbType.NVarChar).Value = 从Excel读取到的俄语字符串;
            cmd.ExecuteNonQuery();
        }
    }
    
    别用SqlDbType.VarChar,否则会把Unicode转成非Unicode,直接导致乱码。

3. 确认OfficeOpenXml读取的字符串是正确的Unicode

虽然你说调试时正常,但可以再验证下:读取后把字符串输出到控制台,或者查看字符串的Length属性——俄语每个字符占2字节,Length应该和实际字符数一致,确保读取环节没有把Unicode转成其他编码。

4. 检查数据库的排序规则(可选)

如果前面几步都做了还是有问题,可以看下数据库或表的排序规则,推荐用支持俄语的规则,比如Russian_CI_AS。不过只要字段是nvarchar,排序规则主要影响排序和比较,一般不会导致显示???,但调整下更稳妥:

ALTER TABLE YourTableName COLLATE Russian_CI_AS;

按照这几步来,应该就能解决俄语字符显示???的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:34:23