Я надеюсь, что это интересная головоломка для эксперта по 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
Проблема в том, что люди копируют и вставляют значения из электронных писем и т. д. и каким-то образом попадают в таблицу. Я рассматриваю это как отдельную проблему, поскольку я LTRIM(RTRIM(Foo)) как триггер INSERT и UPDATE, но некоторые каким-то образом проходят через сеть.
Мне нужно больше узнать об этом поведении и о том, как его обойти.
Также стоит отметить, что 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 результатов, как и ожидалось?
=
) конечные пробелы игнорируются. Они не предназначены для начальных пробелов. Поэтому'abc ' = 'abc'
однако,' abc' != 'abc'
. Если вас беспокоит, что пользователи вводят начальные и конечные пробелы в значениях, вам следует очистить значение перед его вставкой в базу данных. - person Larnu   schedule 17.03.2020' Bar'
и'Bar '
. - person Larnu   schedule 17.03.2020TRIM
(илиLTRIM
иRTRIM
) удалит их. Покажите нам пример, в котором вы вставляете значение с начальным/конечным пробелом, оборачиваетеTRIM
, и оно все еще имеет начальный/конечный пробел. Если нет, то мы не можем воспроизвести проблему, поскольку известно, что завершающие пробелы игнорируются, а ведущие — нет. - person Larnu   schedule 17.03.2020