T-SQL中转义^、~、大括号及筛选非允许字符的实现方法
解决方案
正确查询语句
你可以直接使用单条件查询完成需求,无需拆分多个条件:
SELECT * FROM SpecialCharacter WHERE SampleString LIKE '%[^ !"#$%&''()*+,./0-9A-Za-z:;<=>?@[\]^_`{|}~-]%' ESCAPE '\'
你之前遗漏的核心规则
SQL Server 的 LIKE 字符集[]有特殊的位置解析规则,你之前的问题都是踩了这个坑:
- ^的转义规则:只有
^紧跟在[之后时才会被识别为取反符,放在字符集的其他位置时,本身就代表普通的^字符,不需要额外转义。你之前的写法直接漏掉了把^加入允许字符列表,所以包含^的记录会被误判为非法。 - -的位置规则:
-放在字符集中间时会被解析为范围运算符,只有放在字符集的开头或者末尾时,才会被识别为普通的横杠字符。你之前把-放在*+和,/之间,会被解析为ASCII码从+到,的字符范围,不是你要的普通横杠。 ~/{/}的处理:这三个字符本身不是SQL LIKE的通配符,直接放进允许字符集即可,不需要特殊处理。你之前没有把这三个字符加入允许列表,所以才需要拆分额外条件过滤,现在直接加入字符集就可以合并为单条件。- 另外你之前的允许列表漏掉了
?和反引号`,会导致包含这两个合法字符的记录被误判,上面的语句已经补全。
效果验证
该语句会正确筛选出包含控制字符\u001a、拉丁语扩展字符ģ的两条非法记录,其余包含^、-、_、{}、~等合法字符的记录都不会被命中,完全符合你的筛选需求。
内容的提问来源于stack exchange,提问作者transport
相关产品推荐
相关产品推荐

