【发布时间】:2022-05-12 04:37:32
【问题描述】:
我希望这对 SQL 专家来说是一个有趣的谜题。
当我运行以下查询时,我希望它不会返回任何结果。
-- Create a table variable Note: This same behaviour occurs in standard tables.
DECLARE @TestResults TABLE (Id int IDENTITY(1,1) NOT NULL, Foo VARCHAR(100) NOT NULL, About VARCHAR(1000) NOT NULL)
-- Add some test data Note: Without space, space prefix and space suffix
INSERT INTO @TestResults(Foo, About) VALUES('Bar', 'No spaces')
INSERT INTO @TestResults(Foo, About) VALUES('Bar ', 'Space Suffix')
INSERT INTO @TestResults(Foo, About) VALUES(' Bar', 'Space prefix')
-- SELECT statement that is filtered by a value without a space and also a value with a space suffix
SELECT
t.Foo
, t.About
FROM @TestResults t
WHERE t.Foo like 'Bar '
AND t.Foo like 'Bar'
AND t.Foo = 'Bar '
AND t.Foo = 'Bar'
结果返回一行:
[Foo] [About]
Bar Space Suffix
我需要更多地了解这种行为以及我应该如何解决它。
另外值得注意的是,LEN(Foo) 也是奇数,如下:
DECLARE @TestResults TABLE (Id int IDENTITY(1,1) NOT NULL, Foo VARCHAR(100) NOT NULL, About VARCHAR(1000) NOT NULL)
INSERT INTO @TestResults(Foo, About) VALUES('Bar', 'No spaces')
INSERT INTO @TestResults(Foo, About) VALUES('Bar ', 'Space Suffix')
INSERT INTO @TestResults(Foo, About) VALUES(' Bar', 'Space prefix')
SELECT
t.Foo
, LEN(Foo) [Length]
, t.About
FROM @TestResults t
给出以下结果:
[Foo] [Length] [About]
Bar 3 No spaces
Bar 3 Space Suffix
Bar 4 Space prefix
没有任何横向思考,我需要将 WHERE 子句更改为什么才能按预期返回 0 个结果?
【问题讨论】:
-
当人们复制粘贴时..它不一定是空格。它也可以是隐形字符。您可能必须使用 PATINDEX 来过滤除字母、数字以外的任何内容。
-
对于等号 (
=) 运算符,将忽略尾随空格。它们不适用于 前导 空格。因此'abc ' = 'abc'然而' abc' != 'abc'。如果您担心用户在值中输入前导和尾随空格,则应在将值插入数据库之前“清理”该值。 -
@SMor 不,它没有
-
微软有一篇关于它的知识库文章,这有帮助吗? support.microsoft.com/en-us/help/316626/…
标签: sql-server varchar trailing-whitespace