Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 default RTRIM  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
declare @a1 varchar(50) = 'adasdsadasd '
declare @a2 varchar(50) = 'adasdsadasd'

if @a1 = @a2 select 'true' else select 'false'

в результате получаю true
что за ерунда?



select @@version

автор
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4302.0 (X64)
Feb 7 2014 17:23:24
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


автор
Microsoft SQL Server 2012 - 11.0.5532.0 (X64)
Jul 14 2014 15:00:27
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
24 июн 15, 15:52    [17811934]     Ответить | Цитировать Сообщить модератору
 Re: default RTRIM  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Двоичник,

хвостовые пробелы не учитываются при сравнении. By design!
Исключение - шаблон для LIKE. Там все пробелы учитываются. ЕМНИП (проверьте самостоятельно)
24 июн 15, 15:59    [17811963]     Ответить | Цитировать Сообщить модератору
 Re: default RTRIM  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
INF: How SQL Server Compares Strings with Trailing Spaces
https://support.microsoft.com/en-us/kb/316626
24 июн 15, 16:30    [17812116]     Ответить | Цитировать Сообщить модератору
 Re: default RTRIM  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6251
iap
Исключение - шаблон для LIKE. Там все пробелы учитываются. ЕМНИП (проверьте самостоятельно)

Не учитывается, если паттерн неюникодный, и строка, к которой применяется паттерн, тоже неюникодная, и при этом хвостовые пробелы в последней:
select
  case when '1  ' like '1' then 1 else 0 end,
  case when N'1  ' like N'1' then 1 else 0 end,
  case when N'1  ' like '1' then 1 else 0 end,
  case when '1  ' like N'1' then 1 else 0 end,
  --
  case when '1' like '1  ' then 1 else 0 end,
  case when N'1' like N'1  ' then 1 else 0 end,
  case when N'1' like '1  ' then 1 else 0 end,
  case when '1' like N'1  ' then 1 else 0 end

- первый кейс даст 1, остальные 0.
Проверялось на 2014 сервере, коллэйшн базы Cyrillic_General_CI_AS (хотя он тут вроде как роли не играет).
24 июн 15, 17:34    [17812431]     Ответить | Цитировать Сообщить модератору
 Re: default RTRIM  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Сон Веры Павловны,

а это разве не означает, что хвостовые пробелы левого операнда LIKE не учитываются, а правого - учитываются, как я и написал?
24 июн 15, 17:38    [17812445]     Ответить | Цитировать Сообщить модератору
 Re: default RTRIM  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
Я бы varbinary сравнивал.
Символьное сравнение несимметрично ЕМНИП.
24 июн 15, 18:01    [17812532]     Ответить | Цитировать Сообщить модератору
 Re: default RTRIM  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6251
iap
Сон Веры Павловны,

а это разве не означает, что хвостовые пробелы левого операнда LIKE не учитываются, а правого - учитываются, как я и написал?

Ну как же - в случае юникодного левого операнда хвостовые пробелы тоже учитываются - все операнды ковертятся к юникоду, а при сравнении по юникодным правилам хвостовые пробелы учитываются всегда.
24 июн 15, 18:08    [17812557]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить