powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / LIKE '%[a-z]%'
17 сообщений из 17, страница 1 из 1
LIKE '%[a-z]%'
    #39989444
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!

Свалился код из-за странного (на первый взгляд) поведения оператора LIKE:
Код: sql
1.
2.
3.
4.
IF '№' LIKE '%[a-z]%'
	select 1
else
	select 0


Результат - 1. Где собака зарыта? Collation базы Cyrillic_General_CS_AS.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989449
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tketano,

Понятно, это такой веселый прикол в collation... Бред. Видимо чье-то мнение, что N и № похожие символы.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989511
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому надёжнее не использовать диапазон, а просто явно перечислить символы, тем более их всего 26.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989552
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano,

да, весёлый collation, № находится между N и O. Надо запомнить. И символ tm в этом же ряду.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989589
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Tketano,

да, весёлый collation, № находится между N и O. Надо запомнить. И символ tm в этом же ряду.
Надо же, какая логика, интересно? Почему то комитет по стандартизации решил, что в алфавитном указатели в книге № находится между N и O, обывательской логике это неподвластно.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989628
Marat2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tketano,
А вот так работает =)
Код: sql
1.
2.
3.
4.
IF '№' LIKE '%[a-z]%' COLLATE Latin1_General_100_CI_AI
	select 1
else
	select 0
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989632
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marat2020
Tketano,
А вот так работает =)

Ну, collation другой. Но с этим collation 1 выдаст вот такое:
Код: sql
1.
2.
3.
4.
IF 'Ñ' LIKE '%[a-z]%' COLLATE Latin1_General_100_CI_AI
	select 1
else
	select 0


https://collation-charts.org/mssql/mssql.0409.1252.Latin1_General_CI_AI.html (для версии 100 там страницы нет, но приведённое по ссылке мало отличается от неё).
Поэтому, как было сказано выше, диапазоны лучше не использовать.

движок форума не дает нужный символ вставить - там перед LIKE символ, как N, но с тильдой сверху.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989633
Marat2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны

Поэтому, как было сказано выше, диапазоны лучше не использовать.


А я не спорю. Просто вдруг человеку всё-таки захочется использовать именно диапазоны.
И да версия 100, это просто скопипастил что под руку подвернулось.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989635
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marat2020
Tketano,
А вот так работает =)
Код: sql
1.
2.
3.
4.
IF '№' LIKE '%[a-z]%' COLLATE Latin1_General_100_CI_AI
	select 1
else
	select 0

А вот так - уже не работает:
Код: sql
1.
2.
3.
4.
IF N'№' LIKE N'%[a-z]%' COLLATE Latin1_General_100_CI_AI
	select 1
else
	select 0


У вас в примере где-то неявная конвертация символа, возможно при передаче запроса серверу из SSMS. Ну или юникодные коллейты по-другому устроены, нежели ASCII-шные.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989639
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, кажется дошло. Когда вы указываете ascii-литералы, ну или поле таблицы не юникодное, то сиквел отбрасывает / заменяет символы, отсутствующие в кодовой странице, на "эквивалентные" (ну или знак вопроса, если таковых не имеется). Причем делает он это, основываясь на дефолтном коллейшне базы, если это литерал, или поля таблицы, если это таблица.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select databasepropertyex(db_name(db_id()), 'Collation');
go
select t.V, char(ascii(t.V)) as [AsciiChar], ascii(t.V) as [AsciiCode], unicode(t.V) as [UtfCode],
	case when t.V LIKE '[A-Za-z]' collate Latin1_General_100_CI_AI then 1 end as [MatchAI],
	case when t.V LIKE '[A-Za-z]' collate Latin1_General_100_BIN then 1 end as [MatchBin],
	case when t.V LIKE '[A-Za-z]' collate Latin1_General_100_BIN2 then 1 end as [MatchBin2]
from (values
	(N'N'),
	(nchar(209)), -- Spanish e~ne because forum mangles it
	(N'№')
) t(V);
go

Если вы поиграетесь с этим кодом на базах с разным коллейшном (Cyrillic / Latin1), отбрасывая юникодный N перед кавычками внутри table value constructor, то вы увидите, что на Latin1 номер превращается в знак вопроса, а на Cyrillic энье превращается в обычную N.

В общем, если у вас только кириллица, то подобрать вариант наверное можно, но если база действительно мультиязычная, то использовать интервалы в LIKE просто не получается.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989722
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Надо же, какая логика, интересно? Почему то комитет по стандартизации решил, что в алфавитном указатели в книге № находится между N и O, обывательской логике это неподвластно.

Видимо они консервативны.
Символ № это буквы «No», которые ранее именно так и указывались, но со временем выделились в специальный знак.
Символы № и ™ относятся к буквам, потому что исторически это были именно обычные буквы. А вот символы © и ® к буквам не относятся.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989775
Tketano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, всем спасибо за обсуждение) Ответ понятен. В итоге отказался от диапазона в пользу явного перечисления англорусского алфавита и цифр. Интересно regular expressions еще на других платформах потестить (типа .net) с текущим и инвариантным CultureInfo.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989927
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
alexeyvg
Надо же, какая логика, интересно? Почему то комитет по стандартизации решил, что в алфавитном указатели в книге № находится между N и O, обывательской логике это неподвластно.

Видимо они консервативны.
Символ № это буквы «No», которые ранее именно так и указывались, но со временем выделились в специальный знак.
Символы № и ™ относятся к буквам, потому что исторически это были именно обычные буквы. А вот символы © и ® к буквам не относятся.
Наверное, это когда то давно было :-)

Сейчас все без исключения пользователи\заказчики возмущаются, видя результат такой интерпретации, а программисты, ругаясь, перечисляют буквы, вместо того, чтобы использовать специально придуманную конструкцию a-z, которая оказалась выброшенной господами из Юникода на помойку.
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39989928
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tketano
Коллеги, всем спасибо за обсуждение) Ответ понятен. В итоге отказался от диапазона в пользу явного перечисления англорусского алфавита и цифр. Интересно regular expressions еще на других платформах потестить (типа .net) с текущим и инвариантным CultureInfo.
А вот интересно, в regexp-е так же?
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39990066
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно в regexp есть подходящий класс символов (вместо диапазона).
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39990096
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Tketano
Коллеги, всем спасибо за обсуждение) Ответ понятен. В итоге отказался от диапазона в пользу явного перечисления англорусского алфавита и цифр. Интересно regular expressions еще на других платформах потестить (типа .net) с текущим и инвариантным CultureInfo.
А вот интересно, в regexp-е так же?

Нет, не так. По крайней мере, в дотнете:
The syntax for specifying a range of characters is as follows:
[firstCharacter-lastCharacter]
where firstCharacter is the character that begins the range and lastCharacter is the character that ends the range. A character range is a contiguous series of characters defined by specifying the first character in the series, a hyphen (-), and then the last character in the series. Two characters are contiguous if they have adjacent Unicode code points. firstCharacter must be the character with the lower code point, and lastCharacter must be the character with the higher code point.
( https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions ) - соответственно,
Код: powershell
1.
2.
3.
cls;
[System.Globalization.CultureInfo]::CurrentCulture | oh;
[System.Text.RegularExpressions.Regex]::IsMatch("№", "[a-z]", [System.Text.RegularExpressions.RegexOptions]::None) | oh;


выводит
Код: plaintext
1.
2.
3.
4.
5.
LCID             Name             DisplayName                                                                                                                            
----             ----             -----------                                                                                                                            
1049             ru-RU            Русский (Россия)                                                                                                                       

False
Alibek B.
Возможно в regexp есть подходящий класс символов (вместо диапазона).

Есть категория юникода L, и класс p{} (категория/блок юникода) (см. вышеприведенную ссылку).
...
Рейтинг: 0 / 0
LIKE '%[a-z]%'
    #39990200
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Особенный порядок с номером именно для Cyrillic_General_ХХ_ХХ MS SQL. Интересно, не связан ли этот порядок с телетайпом, когда No формировался латиницей?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / LIKE '%[a-z]%'
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]