SQL Server 2019中UTF-8编码字符无效数据异常求助
问题:UTF-8编码varchar字段插入特定字符触发SqlException
环境
- VB.NET
- VS 2022(最新版本)
- SQL Server 2019(最新补丁)
问题现象
向设置了Latin1_General_100_CI_AS_SC_UTF8排序规则的varchar字段插入UTF-8数据时,当单个字符被左右弯双引号(例如「J」)或弯单引号包围时,频繁触发SqlException,错误信息为:"Invalid data for UTF8-encoded characters"。但类似“isn’t”这种带弯撇号的多字符内容不会触发错误。
代码示例
Dim SQL As String = "INSERT INTO MyTable ([MyField]) VALUES (@MyField)" Dim curName As String Using cmd As New SqlCommand(SQL, conn) cmd.Parameters.Add("@MyField", SqlDbType.VarChar, 80) While ... ...loop through filereader taking in UTF-8 encoded text data curName = Await oRead.ReadLineAsync() cmd.Parameters("@MyField").Value = curName Try Await cmd.ExecuteNonQueryAsync() Catch ex As Exception Debug.Print("Error: " & ex.Message) ' <--- 错误触发位置 End Try End While End Using
数据库配置
- 列类型:
varchar - 数据库排序规则:
Latin1_General_100_CI_AS_SC_UTF8
原因与解决办法
问题原因
- 编码边界识别错误:SQL Server的UTF-8排序规则下,
varchar存储的是UTF-8编码的多字节字符,弯引号(「」、‘’)属于Unicode补充字符,需要3字节编码。当这类字符与单个ASCII字符组合时,SQL Server可能误判编码序列的边界,认定为无效UTF-8数据。 - 自动编码转换异常:.NET的
String采用UTF-16编码,代码中指定参数为SqlDbType.VarChar时,会自动将UTF-16转换为SQL Server的UTF-8格式,特定字符组合的转换过程中出现兼容问题。
解决办法
办法1:改用Unicode参数与列类型(推荐)
将参数类型改为SqlDbType.NVarChar,让SQL Server以UTF-16格式处理数据,避免UTF-8转换的异常:
cmd.Parameters.Add("@MyField", SqlDbType.NVarChar, 80)
同时建议将数据库列类型改为nvarchar,保持端到端的Unicode支持,彻底消除编码兼容问题。
办法2:显式转换为UTF-8字节数组插入
手动将.NET字符串转换为UTF-8字节数组后再赋值给参数,绕开自动转换的问题:
curName = Await oRead.ReadLineAsync() Dim utf8Bytes As Byte() = Encoding.UTF8.GetBytes(curName) cmd.Parameters("@MyField").Value = utf8Bytes
注意需确保字节数组长度不超过字段定义的长度,且数据库排序规则正确配置。
办法3:替换特殊弯引号(业务允许时)
如果不需要保留弯引号,提前将其替换为普通直引号:
curName = Await oRead.ReadLineAsync() curName = curName.Replace("「", """").Replace("」", """").Replace("‘", "'").Replace("’", "'") cmd.Parameters("@MyField").Value = curName
内容的提问来源于stack exchange,提问作者pbickford
相关产品推荐
相关产品推荐

