如何使SQL Server返回FALSE以比较带有和不带尾随空格的varchars?

Mat*_*hew 12 sql-server varchar

如果我故意在VARCHAR列中存储尾随空格,我如何强制SQL Server将数据视为不匹配?

SELECT 'foo' WHERE 'bar' = 'bar    '
Run Code Online (Sandbox Code Playgroud)

我试过了:

SELECT 'foo' WHERE LEN('bar') = LEN('bar    ')
Run Code Online (Sandbox Code Playgroud)

我看到浮动的一种方法是在每个字符串的末尾添加一个特定的字符,然后将其剥离出来用于我的演示......但这看起来很傻.

有没有一种方法我忽略了?

我注意到它不适用于前导空格所以也许我运行一个函数,它在比较之前反转字符顺序....问题是这使得查询unSARGable ....

Gen*_*нин 7

LEN上的文档(Transact-SQL):

返回指定字符串表达式的字符数,不包括尾随空格.要返回用于表示表达式的字节数,请使用该DATALENGTH函数

此外,从SQL Server如何比较字符串与尾随空格的支持页面:

SQL Server遵循ANSI/ISO SQL-92规范,介绍如何将字符串与空格进行比较.ANSI标准要求对比较中使用的字符串进行填充,以便在比较它们之前使它们的长度匹配.

更新:我删除了我的代码LIKE(在比较期间没有填充空格),DATALENGTH()因为它们对于比较字符串并不是万无一失的

在许多其他地方也有人问过其他解决方案:

  • 这并没有回答所写的问题。它错误地声称这是关于这个问题*明确*要求避免的行为的问题的重复。 (2认同)

Ext*_*rey 6

有时最愚蠢的解决方案是最好的:

SELECT 'foo' WHERE 'bar' + 'x' = 'bar     ' + 'x'
Run Code Online (Sandbox Code Playgroud)

因此,基本上在进行比较之前将任何字符附加到两个字符串。