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
相关产品推荐
相关产品推荐

