Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Как задать 'a-b' < 'aaa' при сортировке?  [new]
Dima T
Member

Откуда:
Сообщений: 15860
Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) Apr 29 2016 23:23:58 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 10586: )
База создана с дефолтными настройками. Collation: Cyrilic_General_Cl_AS
create table t (f char(10))
insert into t values ('aaa')
insert into t values ('abc')
insert into t values ('a-b')
select * from t order by f
drop table t

Результат 'a-b' > 'aaa'
f
aaa
a-b
abc

MySQL дает
f
a-b
aaa
abc

в итоге переглючивает сравнение двух сортированных последовательностей.

ИМХУ правильно 'a-b' < 'aaa'. Как MSSQL заставить сортировать так же как MySQL ?
21 сен 16, 08:16    [19690102]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Dima T
ИМХУ правильно 'a-b' < 'aaa'. Как MSSQL заставить сортировать так же как MySQL ?

кому кажется - креститься надо
А по фатку читайте про Collation
21 сен 16, 09:02    [19690164]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Dima T
Member

Откуда:
Сообщений: 15860
Разобрался. Порешал так
select f from t order by lower(f) COLLATE Cyrillic_General_BIN


Но все равно странно почему так хитро знак '-' учитывается при сравнении. Перемудрили MS.
21 сен 16, 09:42    [19690303]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Гость проходящий мимо
Guest
Dima T,

Попробуй не char, а nvarchar()
21 сен 16, 09:47    [19690323]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
Гость проходящий мимо
Dima T,

Попробуй не char, а nvarchar()



binary
21 сен 16, 09:50    [19690335]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Dima T
Member

Откуда:
Сообщений: 15860
Гость проходящий мимо
Dima T,

Попробуй не char, а nvarchar()

То же самое. В рабочей БД nvarchar, тут написал char чтобы меньше букв было.
aleks2
binary

Можно COLLATE Cyrillic_General_BIN поставить для поля, только мне так глобально не надо. Регистронезависимая сортировка нужна. Надо только на уровне запроса.
21 сен 16, 10:00    [19690366]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Dima T
Но все равно странно почему так хитро знак '-' учитывается при сравнении. Перемудрили MS.
При чём тут "MS"?
MS реализует сравнения в соответствии с международными стандартами сравнений для разных языков (см. стандарт для Unicode).
Претензии к составителям стандартов, и/или к филологам соотв. стран.
21 сен 16, 10:10    [19690427]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
Dima T
Гость проходящий мимо
Dima T,

Попробуй не char, а nvarchar()

То же самое. В рабочей БД nvarchar, тут написал char чтобы меньше букв было.
aleks2
binary

Можно COLLATE Cyrillic_General_BIN поставить для поля, только мне так глобально не надо. Регистронезависимая сортировка нужна. Надо только на уровне запроса.


Осподе, милосердный!
cast(поле as binary) и сравнивай до усрачки.
Тебе ж только одинаковый порядок надо?
21 сен 16, 10:21    [19690491]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
aleks2
Dima T
пропущено...

То же самое. В рабочей БД nvarchar, тут написал char чтобы меньше букв было.
пропущено...

Можно COLLATE Cyrillic_General_BIN поставить для поля, только мне так глобально не надо. Регистронезависимая сортировка нужна. Надо только на уровне запроса.


Осподе, милосердный!
cast(поле as binary) и сравнивай до усрачки.
Тебе ж только одинаковый порядок надо?

преобразование в запросе ведёт к ухудшению использования индексов
21 сен 16, 10:25    [19690508]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
TaPaK
преобразование в запросе ведёт к ухудшению использования индексов

исходя из постановки задачи - на ето можно не обращать внимание
21 сен 16, 10:33    [19690540]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Dima T
Member

Откуда:
Сообщений: 15860
alexeyvg
Dima T
Но все равно странно почему так хитро знак '-' учитывается при сравнении. Перемудрили MS.
При чём тут "MS"?
MS реализует сравнения в соответствии с международными стандартами сравнений для разных языков (см. стандарт для Unicode).
Претензии к составителям стандартов, и/или к филологам соотв. стран.

В MySQL тоже юникод (UTF-8) и регистронезависимая сортировка (COLLATE utf8_general_ci). Буквы специально взял английские.
Затестил в FoxPro - результат как в MySQL.

Как бы очевидно что сравнение должно идти посимвольно (в какой бы кодировке символы не были), т.е. для 'a-b' и 'aaa'
'a' == 'a'
'-' < 'a'
итого 'a-b' < 'aaa'
только у МС получилось что '-' > 'a' и при этом '-' < 'b'. С прочими знаками проблем нет. Например плюс дает результат как у всех:
f
a+b
aaa
abc

Такое впечатление что пытались "улучшить" сортировку чтобы написания с дефисом и без оказывались рядом (например SQL и S-Q-L). И что-то я сомневаюсь что такое в стандартах прописано. Больше похоже что МС умышленно нарушило стандарт.
21 сен 16, 10:41    [19690575]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Dima T
Как бы очевидно что сравнение должно идти посимвольно (в какой бы кодировке символы не были), т.е. для 'a-b' и 'aaa'
'a' == 'a'
'-' < 'a'
итого 'a-b' < 'aaa'
только у МС получилось что '-' > 'a' и при этом '-' < 'b'.

Что тут очевидного, не пойму?
Это "очевидно" только для программистов, которые буковкам присваивают некие "коды". А в реальной жизни нету "кодов", есть правила грамматики, произношение, традиции, языковые нормы.

Между прочим, часть проблем возникает из за использования неправильных символов в неправильном контексте.
Может, вы тире используете для некоего разделения групп, например, в древовидном или ином иерархическом списке, а не там, где положено, в словах? Поэтому и нужна такая сортировка?
Может, вы ещё не знаете о различиях у совершенно разных символов "тире", "дефис", "минус" и "длинное тире"? :-)

Ну и если для каких то целей нужна сортировка по кодам, то вперёд, вы же нашли решение:
Dima T
select f from t order by lower(f) COLLATE Cyrillic_General_BIN

Dima T
С прочими знаками проблем нет.
Вы уверены? :-)
Вот французы считают, что некоторые буквосочетания имеют вес, отличающийся от букв по отдельности. И это тоже отражено в сортировках и сравнениях для соотв. коллейшенов.
21 сен 16, 11:02    [19690674]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Помню, вот тут: глюк при сравнении строк
мы долго колбасили что-то похожее
21 сен 16, 11:24    [19690828]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Dima T
Такое впечатление что пытались "улучшить" сортировку чтобы написания с дефисом и без оказывались рядом (например SQL и S-Q-L). И что-то я сомневаюсь что такое в стандартах прописано. Больше похоже что МС умышленно нарушило стандарт.
Вот, например, неплохое описание: https://habrahabr.ru/post/193048/

Вот примеры обсуждений, в которых иллюстрируются проблемы "недоделок" с сортировками там, где программисты без всяких премудростей решили, что "'a' == 'a', '-' < 'a', итого 'a-b' < 'aaa'":
http://forum.sources.ru/index.php?showtopic=64904
http://stackoverflow.com/questions/1097908/how-do-i-sort-unicode-strings-alphabetically-in-python

Я бы привёл примеры, но сайт не поддерживает Unicode :-(
21 сен 16, 11:32    [19690880]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
iap
Помню, вот тут: глюк при сравнении строк
мы долго колбасили что-то похожее
Да, хорошее обсуждение, и даже есть упоминание стандартов, типа этого: http://collation-charts.org/help.html
21 сен 16, 11:35    [19690896]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Dima T
Member

Откуда:
Сообщений: 15860
alexeyvg, зачем обобщать? Я в курсе про особенности юникода в некоторых языках, но это же русская локаль, в русском нет таких правил. И потом в примере английские буквы и знак минус.

Хорошо, допустим это стандарт, тогда напрашивается вывод: MySQL криво работает с юникодом.

Эпопея не закончилась на 19690303
+ Оказалось код на C# точно так же сравнивает
			Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false); // Английский США
			var arr = new String[] {"abc", "aaa", "a-b" };

			foreach(var s in arr.OrderBy(x => x)) {
				Console.WriteLine(s);
			}

aaa
a-b
abc

К сожалению больше затестить негде, поэтому поднял топик с просьбой потестить в разных СУБД. Посмотрим что окажется по факту.
21 сен 16, 12:11    [19691225]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Dima T
alexeyvg, зачем обобщать? Я в курсе про особенности юникода в некоторых языках, но это же русская локаль, в русском нет таких правил. И потом в примере английские буквы и знак минус.

Разве в русском не такие правила?

Вот, допустим, есть список, там слова:
премьера
премьер-министр
премьерный

Разве они не в таком порядке сортируются, разве премьер-министр должен быть первым в сортировке?

И ещё, я говорил про упрощение понимания разных знаков "чёрточка" :-)
Может, для других чёрточек другие правила?

У меня такое предположение, что тут "-" воспринимается как символ переноса слова. Разумеется, символ переноса не имеет веса, когда находится рядом с буквой.

Это всё уходит к древним компьютерам.

Когда то в компьютерах были только большие буквы, ну и плюс несколько символов. Разумеется, для нескольких символов "чёрточка" места не было.
Потом мощь компьютеров возросла настолько, что добавили и маленькие буквы. Но по лености программистов не стали добавлять "чёрточки", хотя на пиш-машинках они были. Тем более, что было странно, что компьютеры вдруг смогут хранить слова и фразы (!), будут их сортировать и сравнивать согласно правилам, , и им вообще понадобятся такие символы.

Но вот, прошли десятилетия, тексты в компьютерах уже давно, а на клавиатуре до сих пор одна чёрточка, которую как только не используют...
21 сен 16, 17:23    [19693339]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Dima T
Member

Откуда:
Сообщений: 15860
Нагуглил Unicode Collation Algorithm там 5 видов сравнения. Сравнивай по-любому как я понял.
Но МС как обычно не как все. Опрос показал что Oracle, PostgreSQL, DB2, H2, java сортируют как MySQL.
21 сен 16, 18:41    [19693668]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Dima T
Нагуглил Unicode Collation Algorithm там 5 видов сравнения. Сравнивай по-любому как я понял.
Но МС как обычно не как все. Опрос показал что Oracle, PostgreSQL, DB2, H2, java сортируют как MySQL.
Да, интересно, спасибо за ссылку...
21 сен 16, 22:03    [19694160]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
alexeyvg
У меня такое предположение, что тут "-" воспринимается как символ переноса слова. Разумеется, символ переноса не имеет веса, когда находится рядом с буквой.


Это "пустой символ" в коллэйшене, т.е. символ который исключается и вообще не участвует в сравнении.
После чего все становится логичным.

Ибо в русском
премьер-министр
и есть, суть,
премьерминистр
22 сен 16, 05:33    [19694538]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
aleks2
alexeyvg
У меня такое предположение, что тут "-" воспринимается как символ переноса слова. Разумеется, символ переноса не имеет веса, когда находится рядом с буквой.


Это "пустой символ" в коллэйшене, т.е. символ который исключается и вообще не участвует в сравнении.
После чего все становится логичным.

Ибо в русском
премьер-министр
и есть, суть,
премьерминистр
Ну, я пытаюсь понять, как это объясняется "человеческим языком", а не языком стандарта кодировок :-)

Если читать всю статью:
Dima T
Нагуглил Unicode Collation Algorithm
то там вообще много интересного, замучаешься изучать, особенно, если это не нужно...
22 сен 16, 10:15    [19695054]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Dima T
Нагуглил Unicode Collation Algorithm
Это было в теме по моей ссылке: 14613278
22 сен 16, 10:26    [19695114]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
Изопропил
Member

Откуда:
Сообщений: 31575
aleks2
Гость проходящий мимо
Dima T,

Попробуй не char, а nvarchar()



binary

а букву Ё куда девать?
22 сен 16, 11:24    [19695541]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
Изопропил
aleks2
пропущено...



binary

а букву Ё куда девать?


А зачем ее "девать"? Тредстартеру только "одинаковая сортировка" нужна.
22 сен 16, 14:01    [19696561]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
AlexanP
Member

Откуда:
Сообщений: 165
Все-таки можно еще раз разъяснить, например если в таблице с колонкой Name (nvarchar) есть строки
внутри которых и латинские, кириллица, китайские и т.п. символы типа 'abcd абвгд 漢字, 汉字 ҀҁѬѭѡ',
то при сортировке
order by Name Collate XXXXXX

как будут сортироваться символы ?
Сначала
1)латинские
2)кириллица
3)китайские

Как сортируются китайские иероглифы если Collate = Traditional_Spanish_ci_ai ?
1 дек 16, 22:45    [19957731]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить