在 SQL Server 2008 中,为什么这会返回该行,即使我在 where 子句的末尾添加了一个或两个或更多空格?在以下示例中不应该找到零记录吗?
WITH SRC AS (SELECT cast('12345' as varchar) DEMO)
SELECT * FROM SRC WHERE DEMO='12345 '
如果需要查询查找'1234 '
但没有怎么办'1234'
在 SQL Server 2008 中,为什么这会返回该行,即使我在 where 子句的末尾添加了一个或两个或更多空格?在以下示例中不应该找到零记录吗?
WITH SRC AS (SELECT cast('12345' as varchar) DEMO)
SELECT * FROM SRC WHERE DEMO='12345 '
如果需要查询查找'1234 '
但没有怎么办'1234'
发生的事情是 SQL 将空格填充到字符串的末尾,以便它们具有相同的长度。因此,如果您尝试执行以下操作:
你实际上会得到 1 回来,即使它们不一样。但是,如果您执行以下操作:
它不会返回任何内容,因为它会将不匹配的“a”与“a”进行比较。
但是,这将返回 1:
因为它正在比较 'a' 和 'a'
如果您使用的是 Unicode 数据,则只需使用
LIKE
. 从文档中:对于非 Unicode 数据,您仍然可以获得 Unicode
LIKE
行为,但需要进行一些隐式转换(注意LIKE
第二个查询中的模式有前导“N”,表示 Unicode 字符串文字):结果:
通过动态搜索生成的魔力,具有隐式转换的代码可能仍然可以使用索引:
关于问题的以下部分:
似乎使用二进制排序规则(即以 结尾的排序规则
_BIN2
)对此不起作用,但您还可以比较DATALENGTH
两个值的:退货:
srutzky 对问题“假设”部分的回答的替代方案:
只需确保您比较的内容的最后一个字符不是空白即可。
最好在 WHERE 子句中保留两个条件(直接比较和计算比较)以保留索引使用。