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

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


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

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

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

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

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


А я не спорю. Просто вдруг человеку всё-таки захочется использовать именно диапазоны.
И да версия 100, это просто скопипастил что под руку подвернулось.
...
Рейтинг: 0 / 0
14.08.2020, 04:28
    #39989635
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
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
14.08.2020, 06:26
    #39989639
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
Ага, кажется дошло. Когда вы указываете 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
14.08.2020, 11:31
    #39989722
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
alexeyvg
Надо же, какая логика, интересно? Почему то комитет по стандартизации решил, что в алфавитном указатели в книге № находится между N и O, обывательской логике это неподвластно.

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

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

Сейчас все без исключения пользователи\заказчики возмущаются, видя результат такой интерпретации, а программисты, ругаясь, перечисляют буквы, вместо того, чтобы использовать специально придуманную конструкцию a-z, которая оказалась выброшенной господами из Юникода на помойку.
...
Рейтинг: 0 / 0
14.08.2020, 19:14
    #39989928
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
Tketano
Коллеги, всем спасибо за обсуждение) Ответ понятен. В итоге отказался от диапазона в пользу явного перечисления англорусского алфавита и цифр. Интересно regular expressions еще на других платформах потестить (типа .net) с текущим и инвариантным CultureInfo.
А вот интересно, в regexp-е так же?
...
Рейтинг: 0 / 0
15.08.2020, 16:56
    #39990066
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
Возможно в regexp есть подходящий класс символов (вместо диапазона).
...
Рейтинг: 0 / 0
15.08.2020, 19:11
    #39990096
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
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
16.08.2020, 12:55
    #39990200
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LIKE '%[a-z]%'
Особенный порядок с номером именно для Cyrillic_General_ХХ_ХХ MS SQL. Интересно, не связан ли этот порядок с телетайпом, когда No формировался латиницей?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / LIKE '%[a-z]%' / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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