SQL Server如何通过WHERE子句查询含特殊字符●●●●●●●●的记录
SQL Server检索特殊Unicode字符无结果的解决方案
核心原因
查询无法返回目标记录的本质是筛选条件的字符串字面量未声明为Unicode类型:
- 字段中存储的
●是Unicode特殊字符(码位U+25CF),属于双字节字符,通常存储在nvarchar/nchar类型字段中 - 当筛选值写为
'●●●●●●●●'、不带N前缀时,SQL Server会将该字符串按数据库默认的非Unicode代码页做隐式转换,这类不在非Unicode代码页中的特殊字符会被转换为默认占位符,和字段内实际存储的Unicode值无法匹配,因此返回空结果。
可直接生效的查询写法
在字符串字面量前增加N前缀,显式标记其为Unicode类型字符串即可命中记录:
USE [Kinetics_model2] GO SELECT [Id] ,[lastPort] ,[nextPort] FROM [dbo].[Observation] WHERE lastPort = N'●●●●●●●●'
同形字符干扰的排查方案
如果加N前缀后仍无法命中,说明界面显示的●是视觉效果一致但Unicode码位不同的同形字符(如其他类型的圆点、控制字符、私有码位字符等),可先解析目标记录的实际字符编码,避开视觉识别误差:
-- 定位到已知的目标记录,逐位解析lastPort字段的实际字符编码 SELECT Id, lastPort, UNICODE(SUBSTRING(lastPort, 1, 1)) AS pos1_code, UNICODE(SUBSTRING(lastPort, 2, 1)) AS pos2_code, UNICODE(SUBSTRING(lastPort, 3, 1)) AS pos3_code, UNICODE(SUBSTRING(lastPort, 4, 1)) AS pos4_code, UNICODE(SUBSTRING(lastPort, 5, 1)) AS pos5_code, UNICODE(SUBSTRING(lastPort, 6, 1)) AS pos6_code, UNICODE(SUBSTRING(lastPort, 7, 1)) AS pos7_code, UNICODE(SUBSTRING(lastPort, 8, 1)) AS pos8_code FROM [dbo].[Observation] WHERE Id = 10088
拿到准确的字符编码后,可以直接通过编码构造筛选条件,完全绕开同形字符的干扰,例如此前确认所有字符都是U+25CF的黑圆点时,查询可写为:
SELECT [Id], [lastPort], [nextPort] FROM [dbo].[Observation] WHERE lastPort = REPLICATE(NCHAR(0x25CF), 8)
内容的提问来源于stack exchange,提问作者AlwaysResearching
相关产品推荐
相关产品推荐

