我错误地输入了查询 SELECT * FROM Users WHERE UserName = 'admin '。但我发现结果与 SELECT * FROM Users WHERE UserName = 'admin' 相同 似乎...
我写了一个查询
SELECT * FROM Users WHERE UserName = 'admin '
错误地输入。但我发现结果和
SELECT * FROM Users WHERE UserName = 'admin'
看起来 SQL Server 会自动忽略末尾的空白。
谁能告诉我为什么?
仅供参考,该列 UserName 属于类型 nvarchar(MAX) .
UserName
nvarchar(MAX)
SQL Server 遵循 ANSI/ISO 标准进行字符串比较。
文章 “SQL Server 如何比较带有尾随空格的字符串” 详细解释了这一点。
SQL Server 遵循 ANSI/ISO SQL-92 规范...关于如何比较带空格的字符串。ANSI 标准要求对用于比较的字符串进行填充,以便在比较之前使它们的长度匹配。填充直接影响 WHERE 和 HAVING 子句谓词和其他 Transact-SQL 字符串比较的语义。例如,对于大多数比较操作,Transact-SQL 认为字符串“abc”和“abc ”是等价的。
此外,正如文章中所解释的,如果您与之比较, LIKE 您就 不会 发现这种行为。
LIKE
当然,与 LIKE 进行比较并不会测试是否相等,因此下一个自然的问题是如何让 SQL Server 在比较带有和不带有尾随空格的 varchars 时返回 FALSE?
所以本质上,当你比较两个不同长度的字符串时,较短的字符串会用空格填充到较长字符串的长度?我从来没有想过。我一度以为我公司的软件中有一个 Schrödinbug 被激活了,导致字符串出现了虚假的尾随空格,但事实证明这并没有什么区别,我看到的 bug 是出于其他原因。
如果你正在尝试这样做
SQL Server 会忽略空格。但如果你尝试这样做
SELECT * FROM Users WHERE UserName Like 'admin '
它也考虑了空白处。
DECLARE @Person1 varchar(50)='admin' SELECT 1 WHERE @Person1 = 'admin ' SELECT 1 WHERE @Person1 like 'admin '
上述查询集的结果是