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

Откуда:
Сообщений: 44
Добрый день.

В коде есть проверка на соответствие символов в строке некоему подмножеству символов. Недавно заметил, что он не отрабатывает на символе номера №, как нужно (то есть, видимо, отрабатывает верно, просто я чего-то не понимаю).

Упрощенный код:

if UPPER('№') like '%[^/?:().,''+ A-Z0-9-]%'
	select 'ERR'


Никак не пойму, почему он считает, что символ № попадает в указанный диапазон.
Подскажите, где может быть зарыта собака. Может что-то с кодировками где-то что-то указать нужно строго? Все остальные символы отрабатывают адекватно моему ожиданию.
26 мар 18, 13:18    [21286097]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
а у меня всё штатно работает )) ?
26 мар 18, 13:23    [21286122]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
RuCosinus
Member

Откуда:
Сообщений: 44
Гигабайт Мегабайтович Килобайтов
а у меня всё штатно работает )) ?

Вооот... Тоже какой-никакой результат. Значит что-то "в консерватории" править нужно. Но что?
26 мар 18, 13:36    [21286175]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36698
Информация для размышления:
if UPPER('№') like '%[^/?:().,''+ A-Z0-9-]%' collate Cyrillic_General_Bin
	select 'ERR'

if UPPER('№') like '%[^/?:().,''+ A-Z0-9-]%' collate Cyrillic_General_CI_AS
	select 'ERR'
26 мар 18, 13:36    [21286177]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
KRS544
Member

Откуда:
Сообщений: 497
Еще
if UPPER('№') like '%[^/?:().,''+ A-Z0-9-]%' collate Cyrillic_General_CI_AS
	select 'ERR'
if UPPER('№') like '%[/^?:().,''+ A-Z0-9-]%' collate Cyrillic_General_CI_AS
	select 'ERR'
26 мар 18, 13:55    [21286244]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

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

ну вот . а только я хотел пообщаться с товарищем ))
26 мар 18, 13:55    [21286247]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
KRS544
Member

Откуда:
Сообщений: 497
Или даже так :)
if UPPER('0') like '%[^/?:().,''+ A-Z0-9-]%' 
	select 'ERR'

if UPPER('0') like '%[/^?:().,''+ A-Z0-9-]%' 
	select 'ERR'


Все дело в ^
26 мар 18, 13:57    [21286257]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KRS544
Или даже так :)
if UPPER('0') like '%[^/?:().,''+ A-Z0-9-]%' 
	select 'ERR'

if UPPER('0') like '%[/^?:().,''+ A-Z0-9-]%' 
	select 'ERR'


Все дело в ^

тут всё дело в вашей голове. А умные люди говорят смотреть на collate
26 мар 18, 14:00    [21286268]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Гораздо правильнее вообще не пользоваться диапазонами.
Все беды от них. Разве так сложно просто написать все символы явно?
И COLLATE тогда будет неважен.

От A до Z - всего 26 символов, от 0 до 9 - всего 10. Эх, лень-матушка...
26 мар 18, 14:17    [21286340]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
KRS544
Member

Откуда:
Сообщений: 497
мммда
if '№' collate Latin1_General_CI_AS = '?' collate Latin1_General_CI_AS select 'ERR2'
select  ASCII('№' collate Latin1_General_CI_AS) , ASCII('?' collate Latin1_General_CI_AS)

прям открыли глаза...
26 мар 18, 15:57    [21286747]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KRS544
мммда
if '№' collate Latin1_General_CI_AS = '?' collate Latin1_General_CI_AS select 'ERR2'
select  ASCII('№' collate Latin1_General_CI_AS) , ASCII('?' collate Latin1_General_CI_AS)

прям открыли глаза...

дык нету шапочки
http://collation-charts.org/mssql/mssql.0409.1252.Latin1_General_CI_AI.html
26 мар 18, 16:05    [21286800]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
KRS544
Member

Откуда:
Сообщений: 497
TaPaK, да понятно, нет в латинской кодировке №, это символ в ? преобразуется
26 мар 18, 16:10    [21286839]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
RuCosinus
Member

Откуда:
Сообщений: 44
Всем спасибо.

Хоть мои предположения относительно кодировки оказались не совсем впрямую влияющими, но тем не менее я был близок. Собака порылась в collation.
Спасибо всем за популярное разъяснение.
26 мар 18, 16:29    [21286962]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
нуб987
Member

Откуда:
Сообщений: 48
iap
Гораздо правильнее вообще не пользоваться диапазонами.
Все беды от них. Разве так сложно просто написать все символы явно?
И COLLATE тогда будет неважен.

От A до Z - всего 26 символов, от 0 до 9 - всего 10. Эх, лень-матушка...

если это сарказм и ирония, то дальше мой комментарий можете не читать

но если вы это на полном серьезе...
если есть возможность использовать диапазон, почему бы этим не пользоваться? Чего плохого в сокращении кода? А то сейчас скатимся до машинных кодов.
Если я напишу вот так:
абвгдежзийклмнопрстуфхцчшщъыьэюя

или так
абвгдежзийкчмнопрстуфхцлшщъыьэюя

вы сможете сходу определить, какие буквы поменяны местами или какой не хватает?
А если такого кода не на одну страничку, а несколько мегабайт и вы дополняете/правите чужой код?
26 мар 18, 16:51    [21287090]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
нуб987,

Порядок не имеет значение.
Если бы ТС сразу указал все что он хочет отфильтровать, то и темы бы не было.
Если вы беконечно лайкаете, то что-то с архитектурой у вас сильно не так
26 мар 18, 16:55    [21287108]     Ответить | Цитировать Сообщить модератору
 Re: Оператор LIKE по шаблону не срабатывает на символ номера (N с кружочком)  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
нуб987
если есть возможность использовать диапазон, почему бы этим не пользоваться? Чего плохого в сокращении кода?
Плохо, что такая запись зависит от COLLATE.
А без диапазонов имеет однозначный смысл.
26 мар 18, 18:13    [21287444]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить