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

Откуда:
Сообщений: 331
В выражении с LIKE следующего вида не учитывается регистр
LIKE '%[^0123456789ABCDEFGHJKLMNPRSTUVWXYZ]%'


Это выражение учитывает
LIKE '%[a-z]%'


По отдельности оба выражения работают, только первое игнорирует регистр (и строчные и прописные - все едино). Добавил к первому второе, чтобы выполнялись оба условия, но в связке они работать не хотят.
Field LIKE '%[^0123456789ABCDEFGHJKLMNPRSTUVWXYZ]%' OR Field LIKE '%[a-z]%')


Нужно
Почему так происходит?
25 мар 16, 15:17    [18978330]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Почитайте про COLLATE. CI / CS
25 мар 16, 15:23    [18978370]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ypmail,

это зависит от COLLATE поля или базы (если у поля явно не было задано).
В принципе, и диапазоны трактуются по-разному в зависимости от COLLATE.

Например? можно задать COLLATE прямо в запросе явно:
LIKE '%[^0123456789ABCDEFGHJKLMNPRSTUVWXYZ]%' COLLATE Cyrillic_General_BIN
25 мар 16, 15:24    [18978375]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT 1
WHERE 'ABC' LIKE '%a%' COLLATE Cyrillic_General_100_CS_AS -- case sensitive

SELECT 1
WHERE 'ABC' LIKE '%a%' COLLATE Cyrillic_General_100_CI_AS -- case insensitive

Есть коллейшен на уровне сервера, базы, столбца, и тд. Все есть в справке.
25 мар 16, 15:26    [18978386]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Кстати, я считаю, что из-за зависимости от COLLATE диапазоны лучше не применять:
[abcdefghijklmnopqrstuvwxyz]
вместо
[a-z]
25 мар 16, 15:27    [18978389]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
ypmail
Member

Откуда:
Сообщений: 331
Спасибо за помощь!!!
25 мар 16, 15:53    [18978585]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
ypmail
Member

Откуда:
Сообщений: 331
[quot AlanDenton]
SELECT 1
WHERE 'ABC' LIKE '%a%' COLLATE Cyrillic_General_100_CS_AS -- case sensitive


У меня заработало с этим выражением. Я задаю условие на значение поля в программной оболочке в виде:
<Значение> LIKE '%[^0123456789ABCDEFGHJKLMNPRSTUVWXYZ]%' COLLATE Cyrillic_General_100_CS_AS


Не совсем понятно Cyrillic_General_100_CS_AS - это означает кириллица с учетом регистра, но я вроде бы использую диапазон на латинице. Хотя и работает.

Если мне нужно проверить значения и на кириллице и на латинице с учетом регистра, как тогда правильно записать?
Т.е.
<Значение> LIKE '%[^0-9 A-ZА-Я]%' COLLATE Cyrillic_General_100_CS_AS
- это уже не работает.
28 мар 16, 08:43    [18984924]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
ypmail
Member

Откуда:
Сообщений: 331
Еще методом научного втыка проверил
Cyrillic_General_100_BIN и Cyrillic_General_100_BIN2 - вроде работают оба.

Не могу найти, что значит 100? И в чем отличие BIN от BIN2, как это понимать по русски и на пальцах?
28 мар 16, 10:00    [18985162]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
Glory
Member

Откуда:
Сообщений: 104751
ypmail
Не могу найти, что значит 100?


SELECT *,COLLATIONPROPERTY(Name, 'CodePage') CodePage,COLLATIONPROPERTY(Name, 'LCID') LCID,
 COLLATIONPROPERTY(Name, 'Version') Version 
 FROM fn_helpcollations()
WHERE Name like 'Cyrillic_General_%BIN%';

Version
The version of the collation, derived from the version field of the collation ID. Returns 2, 1, or 0.
All new collation versions introduced in SQL Server 2008 (collations with "100" in the name) return 2.
All collation versions introduced in SQL Server 2005 (collations with "90" in the name) return 1.
All other collations, introduced in earlier versions of SQL Server return 0.

https://msdn.microsoft.com/en-us/library/ms188046.aspx
https://msdn.microsoft.com/en-us/library/ms143350(v=sql.105).aspx

Сообщение было отредактировано: 28 мар 16, 10:10
28 мар 16, 10:09    [18985205]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
ypmail
Member

Откуда:
Сообщений: 331
Для новичка сложновато воспринимается. Какое выражение лучше использовать для условия на значение, чтобы был допустим ввод только прописных латинского и русского алфавита, а также цифр и пробелов C УЧЕТОМ РЕГИСТРА?

<Значение> LIKE '%[^0-9 A-ZА-Я]%' COLLATE Cyrillic_General_100_BIN
<Значение> LIKE '%[^0-9 A-ZА-Я]%' COLLATE Cyrillic_General_100_BIN2
<Значение> LIKE '%[^0-9 A-ZА-Я]%' COLLATE Cyrillic_General_BIN
<Значение> LIKE '%[^0-9 A-ZА-Я]%' COLLATE Cyrillic_General_BIN2
28 мар 16, 10:29    [18985285]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
Glory
Member

Откуда:
Сообщений: 104751
ypmail
Какое выражение лучше использовать для условия на значение, чтобы был допустим ввод только прописных латинского и русского алфавита, а также цифр и пробелов C УЧЕТОМ РЕГИСТРА?

Если вы не видите и не понимаете разницы, описанной в ссылках, то для вас нет разницы.
28 мар 16, 10:39    [18985338]     Ответить | Цитировать Сообщить модератору
 Re: LIKE со значениями вне диапазона не учитывает регистр  [new]
sergeimv
Member

Откуда: Россия, г.Казань
Сообщений: 42
select 1 where patindex('%[^а-яА-ЯёйЙЁa-zA-Z0-9\ ]%', 'ЕГ Qё 1 й ') = 0
28 мар 16, 11:07    [18985467]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить