如何读取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
相关产品推荐
相关产品推荐

