powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблемы с order by
6 сообщений из 6, страница 1 из 1
Проблемы с order by
    #40023613
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
Collation базы данных - Cyrillic_General_CI_AS.
В  1й строке таблицы и в переменной @a первый символ "точка".
Во 2й строке таблицы и в переменной @b первый символ "одиночная кавычка".
Я во всех запросах для чистоты эксперимента прописал collate. Но что с ним, что без него, результат один и тот же.

Выполняем:
Код: sql
1.
2.
3.
4.
set nocount on;
declare @t table (id int,string varchar(100)); insert @t(id,string) values(1,'.]`]]Я=?'),(2,'''.-^:Я=?');
select * from @t order by left(string,3) collate Cyrillic_General_CI_AS;
select * from @t order by      string    collate Cyrillic_General_CI_AS;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Получаем:
id          string
----------- ----------
2           '.-^:Я=?
1           .]`]]Я=?

id          string
----------- ----------
1           .]`]]Я=?
2           '.-^:Я=?


То есть, если сортируем по 3м и менее первым символам столбца - получаем правильный (с моей точки зрения) результат.
Если по всему столбцу или по первым 4м и более символам, то неверный.

Аналогично, непонятный для меня результат, если использовать переменные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
  @a varchar(100) = '''.-^:Я=?',
  @b varchar(100) = '.]`]]Я=?',
  @s varchar(100) = '         ';
declare
  @q int          = ascii(left(@a,1)),
  @d int          = ascii(left(@b,1));
print concat('dot=',@d,'  quote=',@q);
print '================';

print concat(char(@d),@s,char(@q),@s,     case when  char(@d)  >char(@q)  collate Cyrillic_General_CI_AS then '>' when char(@d)  <char(@q)    collate Cyrillic_General_CI_AS then '<' end);
print concat('.         ''         ',     case when  '.'      > ''''      collate Cyrillic_General_CI_AS then '>' when '.'      < ''''        collate Cyrillic_General_CI_AS then '<' end);
print concat(@b,      '  ',@a,      '  ', case when left(@b,1)>left(@a,1) collate Cyrillic_General_CI_AS then '>' when left(@b,1)<left(@a,1)  collate Cyrillic_General_CI_AS then '<' end);
print concat(@b,      '  ',@a,      '  ', case when left(@b,3)>left(@a,3) collate Cyrillic_General_CI_AS then '>' when left(@b,3)<left(@a,3)  collate Cyrillic_General_CI_AS then '<' end);
print concat(@b,      '  ',@a,      '  ', case when left(@b,4)>left(@a,4) collate Cyrillic_General_CI_AS then '>' when left(@b,4)<left(@a,4)  collate Cyrillic_General_CI_AS then '<' end);
print concat(@b,      '  ',@a,      '  ', case when      @b   >     @a    collate Cyrillic_General_CI_AS then '>' when      @b   <     @a     collate Cyrillic_General_CI_AS then '<' end);


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
dot=46  quote=39
================
.         '         >
.         '         >
.]`]]Я=?  '.-^:Я=?  >
.]`]]Я=?  '.-^:Я=?  >
.]`]]Я=?  '.-^:Я=?  <
.]`]]Я=?  '.-^:Я=?  <

Почему так происходит? Что я не понимаю?
Как добиться того, чтобы итог был всегда одинаковый? Чтобы при ASC-сортировке по всему столбцу, сначала шла строка с одиночной кавычкой, а потом с точкой.
...
Рейтинг: 0 / 0
Проблемы с order by
    #40023623
Guf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prolog,

Потому что в разных Collation сортировка может зависеть от предыдущих и последующих символов. Если "правильной" считается сортировка согласно двоичных кодов символов, то надо использовать двоичный Collation - Cyrillic_General_BIN2
...
Рейтинг: 0 / 0
Проблемы с order by
    #40023635
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guf
Потому что в разных Collation сортировка может зависеть от предыдущих и последующих символов.

Что-то про такое ни разу не слышал. А примеры можете привести?
Про Cyrillic_General_BIN2 - спасибо! Попробую проверить.
...
Рейтинг: 0 / 0
Проблемы с order by
    #40023761
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prolog
Что-то про такое ни разу не слышал. А примеры можете привести?
На этом форуме тыщу раз приводились примеры, поищите...
Да, собственно, вы сами привели пример :-)
...
Рейтинг: 0 / 0
Проблемы с order by
    #40023768
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Проблемы с order by
    #40023938
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблемы с order by
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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