Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение символов vs сравнение их ascii-кодов  [new]
Почтальон-сортировщик
Guest
hi all. SS 2005 Express
кто-нить может объяснить, почему:
select result='тильда' + case when '~' < 'a' then ' меньше' else 'больше' end + ', чем ''A'''
выдаёт
тильда меньше, чем 'A'

хотя
select result='ascii-код тильды '+ case when ascii('~') < ascii('a') then ' меньше' else 'больше' end + ', чем ascii-код ''A'''
выдаёт вполне ожидаемое:
ascii-код тильды больше, чем ascii-код 'A'

Что сравнивает SS в первом случае ?

Технет говорит:
technet
В зависимости от характера данных и конфигурации преобразования при сравнении строковых данных может происходить следующая обработка:

* Преобразование данных в Юникод. Если в источнике данных не использована кодировка Юникод, то данные автоматически преобразуются в Юникод до начала сравнения.
* Использование языкового стандарта для применения правил конкретных языковых стандартов при интерпретации даты, времени, десятичных данных и порядка сортировки.
* Применение параметров сравнения на уровне столбца для изменения чувствительности сравнений.


Экран своего charmap.exe прилагаю: видно, что сравниваются точно НЕ юникоды.
Первый вариант вроде бы отваливается.
Третий тут не используется (кажется :)).
Если остаётся второй ("исп-е языкового стандарта"), то где подробнее про это почитать ?

К сообщению приложен файл. Размер - 0Kb
23 авг 09, 00:57    [7570159]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
Почтальон-сортировщик
Guest
Отвечу пока сам себе (может, кому пригодится).
Верный ответ выдаёт сравнение с использованием COLLATE, которому "на вход" даётся аргумент, указывающий необходимость "бинарной сортировки" (нашел в BOL'e: ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/56483d24-add7-483d-9b96-c6fda460ddbc.htm)
select result='тильда' + case when '~' collate Latin1_General_BIN < 'z'collate Latin1_General_BIN then ' меньше' else ' больше' end
выдаёт вроде бы адекватное:
тильда больше


Но всё равно вопрос остался: а что там "по умолчанию" ? где посмотреть, как именно сортируются при их сравнении именно их "как символов", а не ascii-кодов ?
23 авг 09, 01:27    [7570176]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Прочитайте вот это: https://www.sql.ru/articles/mssql/2005/032404ResolveCollationConflict.shtml
Collation базы данных можно узнать так:
SELECT DATABASEPROPERTYEX(N'tempdb','Collation')
Collation поля таблицы
SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=N'ИмяТаблицы' AND COLUMN_NAME=N'ИмяПоля';
О возможных collations можно узнать так:
SELECT * FROM fn_helpcollations()
Как сортируются символы для конкретного collation можно увидеть, например, так:
SELECT number, CHAR(number) COLLATE Cyrillic_General_CI_AI
FROM master.dbo.spt_values
WHERE type='P' AND number BETWEEN 32 AND 255
ORDER BY CHAR(number) COLLATE Cyrillic_General_CI_AI;
23 авг 09, 18:37    [7570742]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
Почтальон-сортировщик
Guest
2 iap: большое спасибо! :-)
Немного улыбнула сортировка первых букв алфавита при выполнении последнего из приведенных Вами запросов: A a b B C c d D

то есть, буквы 'A' и 'C' вроде как младше по сортировке своих lower-case эквивалентов. Однако, буквы 'B' и 'D' - старше. Ситуация, конечно же, исправляется при указании Cyrillic_General_CS_AI вместо Cyrillic_General_CI_AI.

Кстати, правильно ли я понимаю, что
BOL
AccentSensitivity
AI specifies accent-insensitive, AS specifies accent-sensitive.
-- актуально только для алфавитов с диакрическими символами (шведский, датский, франц. етц) ?
23 авг 09, 23:53    [7571135]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Почтальон-сортировщик
Кстати, правильно ли я понимаю, что
BOL
AccentSensitivity
AI specifies accent-insensitive, AS specifies accent-sensitive.
-- актуально только для алфавитов с диакрическими символами (шведский, датский, франц. етц) ?
Нет, неправильно. В применении к кириллице это означает различие в буквах "е" и "ё"
24 авг 09, 10:02    [7571624]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
step_ks
Member

Откуда:
Сообщений: 936
Почтальон-сортировщик
2 iap: большое спасибо! :-)
Немного улыбнула сортировка первых букв алфавита при выполнении последнего из приведенных Вами запросов: A a b B C c d D

то есть, буквы 'A' и 'C' вроде как младше по сортировке своих lower-case эквивалентов. Однако, буквы 'B' и 'D' - старше.

С чего вы это взяли? Не младше и не старше - они эквивалентны в CI коллэйшене.
24 авг 09, 10:29    [7571721]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
Почтальон-сортировщик
Guest
step_ks
С чего вы это взяли? Не младше и не старше - они эквивалентны в CI коллэйшене
почему тогда они в верхнем регистре идут _перед_ своими "эквивалентами" в нижнем регистре, а для букв 'B' и 'D' - всё наоборот ?
24 авг 09, 10:54    [7571818]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Почтальон-сортировщик,

эквивалентны- значит могут идти в _любом_ порядке
24 авг 09, 11:05    [7571871]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
step_ks
Member

Откуда:
Сообщений: 936
Почтальон-сортировщик
step_ks
С чего вы это взяли? Не младше и не старше - они эквивалентны в CI коллэйшене
почему тогда они в верхнем регистре идут _перед_ своими "эквивалентами" в нижнем регистре, а для букв 'B' и 'D' - всё наоборот ?

"перед" и "после" - это у вас на экране. а на самом деле они "вместе" :)
24 авг 09, 14:59    [7573394]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Почтальон-сортировщик,

Лучше напишите так:
SELECT number[Код символа], CHAR(number)[Символ], DENSE_RANK()OVER(ORDER BY CHAR(number) COLLATE Cyrillic_General_CI_AI)[Порядок сортировки]
FROM master.dbo.spt_values
WHERE type='P' AND number BETWEEN 32 AND 255
ORDER BY 3;
Прояснилось?
24 авг 09, 16:51    [7574113]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
Почтальон-сортировщик
Guest
iap
Прояснилось ?
Да, с DENSE_RANK'ом в графе "порядок сортировки" у всех "одноимённых" букв одни и те же значения. В общем-то, вопрос у меня оставался совсем незначительный, "академический": почему при равных значениях порядка сортировки СУБД выдаёт результат этого запроса по какому-то странному правилу: если коды символов-"эквивалентов" есть нечётные числа (например, 65 и 97 для 'A' и 'a' соотв-но), то сначала будет выведено 'A', затем - 'a'. А для символов-"эквивалентов", у которых коды есть чётные числа - наоборот ? Это в самой базе они так записаны, что ли ?
24 авг 09, 18:54    [7574687]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение символов vs сравнение их ascii-кодов  [new]
Денис Ильин
Member

Откуда: Железнодорожный
Сообщений: 242
как хочет, так и выдаёт
24 авг 09, 23:11    [7575143]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить