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

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

原因与解决办法

问题原因

  1. 编码边界识别错误:SQL Server的UTF-8排序规则下,varchar存储的是UTF-8编码的多字节字符,弯引号(「」、‘’)属于Unicode补充字符,需要3字节编码。当这类字符与单个ASCII字符组合时,SQL Server可能误判编码序列的边界,认定为无效UTF-8数据。
  2. 自动编码转换异常:.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:52