Следующий T / SQL: -
create table #temp(foo varchar(10))
insert into #temp select ''
insert into #temp select 'abc'
insert into #temp select ' '
select len(foo) from #temp where foo = ' '
drop table #temp
Возвращает два нуля, несмотря на то, что критерии означают, что он ничего не должен возвращать. Кроме того, он возвращает длину двух строк с пробелами, одна из которых действительно имеет длину 0, но также одна имеет длину 1, сообщая обе как длину 0.
Кто-нибудь знает, что здесь происходит ?!
Обновлять: Похоже, это связано с опцией базы данных ANSI_PADDING, предусмотренной Microsoft в эта статья в базе знаний.





По документации:
Возвращает количество символов указанного строкового выражения, исключая конечные пробелы.
Существует аналогичная функция под названием DataLength, с которой вам следует ознакомиться.
create table #temp(foo varchar(10))
insert into #temp select ''
insert into #temp select 'abc'
insert into #temp select ' '
select len(foo), DataLength(foo) from #temp where foo = ' '
drop table #temp
Конечные пробелы также удалены для сравнения. Вы можете приспособиться к этому, преобразовав данные в varbinary и сравнив их таким образом. Если вы сделаете это, я бы оставил исходное сравнение в покое (по соображениям саргабильности).
create table #temp(foo varchar(10))
insert into #temp select ''
insert into #temp select 'abc'
insert into #temp select ' '
select len(foo), DataLength(foo)
from #temp
where foo = ' '
and Convert(varbinary(8), foo) = Convert(VarBinary(8), ' ')
drop table #temp
Я отредактировал свой исходный ответ, чтобы показать способ фильтрации по одному пространству. Надеюсь это поможет.
Кажется, это применимо и к предложениям where, в любом случае, чтобы предложение where не исключало конечные пробелы?