SSMS执行SQL查询手动输入条件无结果复制值可查询问题排查
SSMS字符匹配异常问题排查
问题现象
执行如下查询时,手动输入A.J. Burnett作为查询条件无任何返回结果,右键复制表中存储的对应值粘贴到查询语句中时,可正常返回符合条件的行,手动输入内容与复制内容视觉上无任何差异:
SELECT TOP (10) * FROM pitch_aggregate WHERE BAT_NAME_FULL = 'A.J. Burnett';
排查过程
- 排查常见控制字符
执行如下查询校验是否存在制表符、换行符、垂直制表符等常见控制字符:
SELECT BAT_NAME_FULL FROM pitch_aggregate WHERE BAT_NAME_FULL LIKE '%Burnett%' AND BAT_NAME_FULL LIKE '%'+CHAR(9)+'%' OR BAT_NAME_FULL LIKE '%'+CHAR(10)+'%' OR BAT_NAME_FULL LIKE '%'+CHAR(11)+'%';
查询无返回结果,排除上述控制字符导致的匹配问题。
2. 二进制转码校验
执行如下查询将字段值转换为二进制格式查看编码:
SELECT TOP (1) CONVERT(varbinary(100),BAT_NAME_FULL) FROM pitch_aggregate;
返回结果为0x412E4A2E204275726E657474。
3. 模糊查询缩小异常范围
首先执行宽范围模糊查询:
SELECT * FROM pitch_aggregate WHERE BAT_NAME_FULL LIKE '%A.J.%' ORDER BY BAT_NAME_FULL;
返回多条结果,包含A.J. Burnett对应的行。
调整模糊查询条件进一步缩小范围:
SELECT * FROM pitch_aggregate WHERE BAT_NAME_FULL LIKE '%A.J. B%' ORDER BY BAT_NAME_FULL;
依然返回多条包含A.J. Burnett的结果,确认异常出现在A.J.和Burnett之间的空格位置。
根因定位
标准半角空格的ASCII码为32,表中存储的名称中间的空格为ASCII码160的非间断空格,二者编码不同,导致手动输入的标准空格无法匹配存储的非间断空格。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

