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

如何在SQL中查找并删除包含Unicode损坏字符的记录

无效Unicode字符导致报表报错的排查与清理方案

问题背景

这类报错本质是数据库中存储了非法的未配对Unicode代理项字符,这类字符无法被转换为指定代码页的编码,所以触发EncoderFallbackException。你之前的查询失效是因为�是Unicode解码失败后的展示字符,并非数据库中实际存储的原始值,直接匹配�无法定位到真实异常记录。

报错原文

ERROR:数据集"DataSet1"中发生异常。详细信息:System.Text.EncoderFallbackException:无法将索引184处的Unicode字符�转换为指定代码页。

定位异常记录的方法

  • 方法1:利用TRY_CONVERT快速筛选(适合海量表,性能最优)
    利用TRY_CONVERT的容错特性,尝试把字符串转换为你目标代码页对应的编码类型,返回NULL的即为包含不可转换异常字符的行:
-- 代码页936对应GBK编码,如果你使用其他编码可替换为对应代码页:比如西欧编码1252、UTF-8 65001
SELECT *
FROM dbo.TestTable
WHERE TRY_CONVERT(VARCHAR(MAX), SomeString, 936) IS NULL
  • 方法2:精准匹配非法Unicode代理项范围
    所有导致这类报错的无效字符都集中在Unicode代理对范围U+D800~U+DFFF,使用二进制排序规则匹配该范围即可定位:
SELECT *
FROM dbo.TestTable
WHERE SomeString LIKE N'%[' + NCHAR(0xD800) + '-' + NCHAR(0xDFFF) + ']%' 
COLLATE Latin1_General_BIN2

清理方案

  • 直接删除异常行(操作前务必做好数据备份)
DELETE FROM dbo.TestTable
WHERE SomeString LIKE N'%[' + NCHAR(0xD800) + '-' + NCHAR(0xDFFF) + ']%' 
COLLATE Latin1_General_BIN2
  • 保留行仅清理异常字符
    可以自定义标量函数遍历字符串每个字符,过滤掉编码在0xD800~0xDFFF区间的字符后替换原字段值即可。

内容的提问来源于stack exchange,提问作者Nuri Ensing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:00:02