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

SQL Server编码问题:如何查询含无效字符的数据?

解决SQL Server中nvarchar列非Unicode字符的检测问题

针对你的场景(Title列为nvarchar类型,排序规则Latin1_General_CI_AS,存在俄文等非Unicode字符),以下是几种可行的查询方案:

方案1:通过类型转换对比检测

利用varchar无法存储Unicode字符的特性,转换后内容会丢失原Unicode信息,通过对比原内容和转换后转回的内容,筛选出不一致的记录:

SELECT *
FROM YourTableName
WHERE Title <> CAST(CAST(Title AS VARCHAR(MAX)) AS NVARCHAR(MAX))

注意:如果Title列有固定长度(如nvarchar(200)),请将VARCHAR(MAX)替换为对应长度的VARCHAR(200),避免不必要的性能损耗。

方案2:检测非ASCII字符

Latin1_General_CI_AS对应的字符集是单字节ASCII(0-255),Unicode字符的编码值超过255,可通过PATINDEX或逐字符检查筛选:

方法A:使用PATINDEX匹配非ASCII范围

SELECT *
FROM YourTableName
WHERE PATINDEX('%[^' + CHAR(0) + '-' + CHAR(255) + ']%', Title) > 0

方法B:逐字符检查Unicode编码(SQL Server 2016+)

SELECT *
FROM YourTableName
WHERE EXISTS (
    SELECT 1
    FROM STRING_SPLIT(Title, '')
    WHERE UNICODE(value) > 255
)

若使用低于2016的SQL Server版本,可替换为递归CTE来拆分字符串逐字符检测。

方案3:利用排序规则差异检测

二进制排序规则(Latin1_General_BIN)会严格匹配字符编码,而Latin1_General_CI_AS可能将部分Unicode字符映射为相近ASCII字符,通过对比两种排序规则下的内容筛选异常记录:

SELECT *
FROM YourTableName
WHERE Title COLLATE Latin1_General_BIN <> Title COLLATE Latin1_General_CI_AS

内容的提问来源于stack exchange,提问作者Sam Salim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:22:38