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

如何读取CSV文件并写入SQL Server时避免字符乱码

解决C#读取CSV写入SQL Server时的字符乱码问题

这个问题我之前帮不少开发者排查过,核心就是编码不匹配加上SQL Server列类型/连接设置没到位,一步步来搞定:

1. 先确认CSV文件的实际编码

你说记事本、Word打开都正常,但记事本默认会自动检测编码,咱们得明确它到底用的啥编码:

  • 用记事本打开你的CSV文件,点击「文件」→「另存为」
  • 在弹出窗口的「编码」下拉框里,看看默认选中的是什么(大概率是Windows-1252,也就是Latin-1的微软变体,或者带BOM的UTF-8)

2. 读取CSV时指定正确编码

别直接用FileStream裸读字节然后硬转字符串,改用StreamReader并指定对应编码,这样读出来的字符才是正确的:

// 假设你的文件编码是Windows-1252
using (var reader = new StreamReader("你的文件路径.csv", Encoding.GetEncoding(1252)))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // 分割CSV内容(注意分号分隔)
        var parts = line.Split(';');
        string city = parts[2]; // São Paulo
        // 后续处理写入数据库
    }
}

如果刚才查出来是UTF-8带BOM,就用Encoding.UTF8;如果是UTF-8无BOM,也可以用Encoding.UTF8,一般都能识别。

3. 确保SQL Server的列类型支持Unicode

这步很关键!如果你的城市列用的是varchar类型,那肯定会把ã变成?——因为varchar是单字节编码,只支持ASCII范围内的字符,必须改成**nvarchar(n)或者nchar(n)**(n根据实际长度设置,比如nvarchar(50))。

4. 数据库连接和插入时启用Unicode

  • 连接字符串里要加上UseUnicode=True(或者Unicode=true,大小写不敏感),确保客户端和服务器之间传输的是Unicode字符:
    Server=你的服务器名;Database=你的库名;User Id=账号;Password=密码;UseUnicode=True;
    
  • 插入数据时用参数化查询,并且明确指定参数类型为SqlDbType.NVarChar,避免隐式转换导致乱码:
    using (var conn = new SqlConnection("你的连接字符串"))
    {
        conn.Open();
        var sql = "INSERT INTO 你的表名 (City, Country) VALUES (@City, @Country)";
        using (var cmd = new SqlCommand(sql, conn))
        {
            // 指定参数类型为NVarChar
            cmd.Parameters.Add("@City", SqlDbType.NVarChar, 50).Value = parts[2];
            cmd.Parameters.Add("@Country", SqlDbType.NVarChar, 50).Value = parts[3];
            cmd.ExecuteNonQuery();
        }
    }
    

最后验证

按上面的步骤改完后,再跑一遍程序,应该就能看到数据库里正确显示São Paulo了。如果还是有问题,再检查下CSV的编码是不是判断错了,或者SQL Server的列有没有真的改成nvarchar。

内容的提问来源于stack exchange,提问作者Ricardo de Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:07:55