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

Откуда: München
Сообщений: 136
MS SQL Server 2005 9.00.2047

ANSI PADDING ENABLED = True

Запускаю такой скрипт
set ansi_padding ON

declare @var1 char(30)
declare @var2 char(30)
set @var1='BME L-MPW081-17OCT01A'
set @var2='BME L-MPW081-17OCT01A    '

select len(@var1),len(@var2)
возвращает 21 и 21.
Аналогично,
select 1 where 'BME L-MPW081-17OCT01A'='BME L-MPW081-17OCT01A    '
возвращает 1.
То есть у второй строки справа обрезаются пробелы.
Кто-нибудь подскажет почему и как избежать?
23 июн 10, 14:22    [8987593]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

ничего не обрезается. просто, функция len не учитывает конечные пробелы.

Posted via ActualForum NNTP Server 1.4

23 июн 10, 14:24    [8987628]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
mishga
Member

Откуда: München
Сообщений: 136
а что насчет селекта? тоже не учитывает?
Как сделать, чтобы учитывал?
23 июн 10, 14:24    [8987645]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
mishga
MS SQL Server 2005 9.00.2047

ANSI PADDING ENABLED = True

Запускаю такой скрипт
set ansi_padding ON

declare @var1 char(30)
declare @var2 char(30)
set @var1='BME L-MPW081-17OCT01A'
set @var2='BME L-MPW081-17OCT01A    '

select len(@var1),len(@var2)
возвращает 21 и 21.
Аналогично,
select 1 where 'BME L-MPW081-17OCT01A'='BME L-MPW081-17OCT01A    '
возвращает 1.
То есть у второй строки справа обрезаются пробелы.
Кто-нибудь подскажет почему и как избежать?
Функция LEN() ВСЕГДА не учитывает хвостовые пробелы.
Об этом ясно написано в BOL.
Придётся использовать функцию DATALENGTH().
Но помнить, что LEN() возвращает количество символов, а DATALENGTH() - количество байт.
23 июн 10, 14:26    [8987660]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> а что насчет селекта? тоже не учитывает?

да. при сравнении строк конечные пробелы тоже не учитываются.

> Как сделать, чтобы учитывал?

select 1 where N'BME L-MPW081-17OCT01A' like N'BME L-MPW081-17OCT01A '

или к varbinary приводить:

select 1 where cast('BME L-MPW081-17OCT01A' as varbinary(max) = cast('BME L-MPW081-17OCT01A ' as varbinary(max))

Posted via ActualForum NNTP Server 1.4

23 июн 10, 14:28    [8987683]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
А какое отношение имеет set ansi_padding к сравнению строк?
А пробелы и не учитываются в LEN и в сравнении строк.
С уважением, Алексей.
23 июн 10, 14:28    [8987684]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
mishga
Member

Откуда: München
Сообщений: 136
Прекрасно. Про len я понял.
Однако, вопрос остался открытым.
Повторяю еще раз.
Почему же все таки
select 1 where 'BME L-MPW081-17OCT01A'='BME L-MPW081-17OCT01A    '
возвращает единицу?
23 июн 10, 14:28    [8987689]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
mishga
Member

Откуда: München
Сообщений: 136
Хорошо, я понял. Пробелы не учитываются в MS SQL.
Не подскажете ли, как сделать, чтобы учитывались?
Или MS SQL не имеет возможности сравнивать строки, отличающиеся кол-вом пробелов?
23 июн 10, 14:30    [8987728]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
mishga
Прекрасно. Про len я понял.
Однако, вопрос остался открытым.
Повторяю еще раз.
Почему же все таки
select 1 where 'BME L-MPW081-17OCT01A'='BME L-MPW081-17OCT01A    '
возвращает единицу?
Вам же сказали, что оператор "=" тоже игнорирует хвостовые пробелы.
А оператор LIKE - нет.
select 1 where 'BME L-MPW081-17OCT01A'LIKE'BME L-MPW081-17OCT01A    ';
select 1 where 'BME L-MPW081-17OCT01A    'LIKE'BME L-MPW081-17OCT01A    ';
23 июн 10, 14:32    [8987747]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Хорошо, я понял. Пробелы не учитываются в MS SQL.
> Не подскажете ли, как сделать, чтобы учитывались?

если вы какую-то настройку ищете, то ее нет.

> Или MS SQL не имеет возможности сравнивать строки, отличающиеся кол-вом
> пробелов?

для _юникодных_ строк конечные пробелы учитываются для like-сравнений.
ну, или к varbinary приводить. или datalength дополнительно сравнивать.

Posted via ActualForum NNTP Server 1.4

23 июн 10, 14:33    [8987758]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
mishga
Хорошо, я понял. Пробелы не учитываются в MS SQL.
Не подскажете ли, как сделать, чтобы учитывались?
Или MS SQL не имеет возможности сравнивать строки, отличающиеся кол-вом пробелов?

Перейти на varchar и усложнить поиск:
declare @var1 varchar(30)
declare @var2 varchar(30)
set @var1='BME L-MPW081-17OCT01A'
set @var2='BME L-MPW081-17OCT01A    '

select len(@var1),len(@var2),  DATALENGTH(@var1), DATALENGTH(@var2)
select 1 where DATALENGTH(@var1) = DATALENGTH(@var2) AND (@var1) = (@var2)
С уважением, Алексей
23 июн 10, 14:33    [8987759]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
mishga
Member

Откуда: München
Сообщений: 136
iap - спасибо!
Вот ответ, которого я ждал!
23 июн 10, 14:33    [8987760]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
mishga
iap - спасибо!
Вот ответ, которого я ждал!

Вам этот ответ daw уже на 4-ом посте, а вы его проигнорировали!
С уважением, Алексей
23 июн 10, 14:36    [8987792]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Бредгаур Виталий
Member

Откуда: Россия, МО
Сообщений: 24
mishga
Прекрасно. Про len я понял.
Однако, вопрос остался открытым.
Повторяю еще раз.
Почему же все таки
select 1 where 'BME L-MPW081-17OCT01A'='BME L-MPW081-17OCT01A    '
возвращает единицу?


Помимо LIKE можно так:

select 1 where 'BME L-MPW081-17OCT01A'+'*'='BME L-MPW081-17OCT01A    '+'*'
23 июн 10, 14:37    [8987806]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Бредгаур Виталий
mishga
Прекрасно. Про len я понял.
Однако, вопрос остался открытым.
Повторяю еще раз.
Почему же все таки
select 1 where 'BME L-MPW081-17OCT01A'='BME L-MPW081-17OCT01A    '
возвращает единицу?


Помимо LIKE можно так:

select 1 where 'BME L-MPW081-17OCT01A'+'*'='BME L-MPW081-17OCT01A    '+'*'

Только при varchar. При char не пойдет.
С уважением, Алексей
23 июн 10, 14:43    [8987886]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
mike909
Member

Откуда:
Сообщений: 662
Aleksey-K,

Масенький нюанс использования "Like"
select 1 where  'BME L-MPW081-17OCT01A' Like 'BME L-MPW081-17OCT01A    '
union all
select 2 where 'BME L-MPW081-17OCT01A    ' Like 'BME L-MPW081-17OCT01A'
т.е. если вместо конкретных значений будут поля таблиц, то ....
23 июн 10, 14:55    [8988053]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Масенький нюанс использования "Like"
> т.е. если вместо конкретных значений будут поля таблиц, то ....

доктор, меня все игнорируют! (с) анекдотъ.

Posted via ActualForum NNTP Server 1.4

23 июн 10, 15:04    [8988154]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
mike909
Aleksey-K,

Масенький нюанс использования "Like"
select 1 where  'BME L-MPW081-17OCT01A' Like 'BME L-MPW081-17OCT01A    '
union all
select 2 where 'BME L-MPW081-17OCT01A    ' Like 'BME L-MPW081-17OCT01A'
т.е. если вместо конкретных значений будут поля таблиц, то ....
+100
если вместо конкретных значений СПРАВА ОТ LIKE будут поля таблиц
LIKE учитывает хвостовые проблемы, только если они содержатся в шаблоне.
А поля потеряют эти пробелы ещё до начала выполнения LIKE.
23 июн 10, 15:05    [8988162]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Извините, был неправ...
iap
mike909
Aleksey-K,

Масенький нюанс использования "Like"
select 1 where  'BME L-MPW081-17OCT01A' Like 'BME L-MPW081-17OCT01A    '
union all
select 2 where 'BME L-MPW081-17OCT01A    ' Like 'BME L-MPW081-17OCT01A'
т.е. если вместо конкретных значений будут поля таблиц, то ....
+100
если вместо конкретных значений СПРАВА ОТ LIKE будут поля таблиц
LIKE учитывает хвостовые пробелы, только если они содержатся в шаблоне.
А
поля потеряют эти пробелы ещё до начала выполнения LIKE.
23 июн 10, 15:08    [8988190]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
mishga
Member

Откуда: München
Сообщений: 136
daw, прошу прощения, не заметил Ваш ответ в 4-м посте, спасибо.
iap, "СПРАВА ОТ LIKE" действительно работает, это тоже вариант.
Ну а вариант Бредгаура Виталия со здездочкой так просто гениален!
Всем спасибо за помощь!
23 июн 10, 16:44    [8989091]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
iljy
Member

Откуда:
Сообщений: 8711
[quot mishgaНу а вариант Бредгаура Виталия со здездочкой так просто гениален![/quot]
Только пользоваться им без крайней необходимости я вам не советую, потому как такой вариант напрочь убивает надежду на использование индекса
23 июн 10, 17:03    [8989281]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
MaratSH,

Читайте хелп. А в следующий раз за подобную экспрессию будет бан.
13 июн 12, 16:09    [12708794]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
MaratSH
Member

Откуда: Moscow
Сообщений: 179
Гавриленко Сергей Алексеевич
MaratSH,

Читайте хелп. А в следующий раз за подобную экспрессию будет бан.


За экспресию извиняюсь, но за оправдание вами этой "СУПЕР"-СУБД - "мне смешно над вами" - как сказал бы знакомы одесит :) :) :)
Какой хэлп, дорогой, если это самое все Г напеисано прямв в этом хэлпе. ха ха ха
13 июн 12, 16:25    [12708976]     Ответить | Цитировать Сообщить модератору
 Re: Обрезаются пробелы в конце строки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
MaratSH
Гавриленко Сергей Алексеевич
MaratSH,

Читайте хелп. А в следующий раз за подобную экспрессию будет бан.


За экспресию извиняюсь, но за оправдание вами этой "СУПЕР"-СУБД - "мне смешно над вами" - как сказал бы знакомы одесит :) :) :)
Какой хэлп, дорогой, если это самое все Г напеисано прямв в этом хэлпе. ха ха ха
Пишите на Оракле. До свиданья.
13 июн 12, 16:27    [12708997]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить