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

ЗЫ. А чо с китайскими иероглифами не так?
2 дек 16, 05:45    [19958099]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
Нет.
Ничего никуда не преобразуется.
Юникодная колонка будет отсортирована по юникодным же точкам входа: как bin2 сортирует по ascii(), так и юникод по unicode().
Кодовая страница коллэйшена для юникодной строки игнорируется вообще, имеют роль только case sensitive, accent sensitive
2 дек 16, 09:19    [19958317]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
o-o
Нет.
Ничего никуда не преобразуется.
Юникодная колонка будет отсортирована по юникодным же точкам входа: как bin2 сортирует по ascii(), так и юникод по unicode().
Кодовая страница коллэйшена для юникодной строки игнорируется вообще, имеют роль только case sensitive, accent sensitive


Наивняк.
Как ты сравнишь китайский иероглиф Янь и русскую букву А?

Головой то надо думать.
2 дек 16, 10:02    [19958481]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
aleks2
o-o
Нет.
Ничего никуда не преобразуется.
Юникодная колонка будет отсортирована по юникодным же точкам входа: как bin2 сортирует по ascii(), так и юникод по unicode().
Кодовая страница коллэйшена для юникодной строки игнорируется вообще, имеют роль только case sensitive, accent sensitive


Наивняк.
Как ты сравнишь китайский иероглиф Янь и русскую букву А?

Головой то надо думать.

Читать тоже надо уметь. Он сравнивает unicode(), читай постом выше, не поверишь, unicode code point есть и у китайских символов, и у кириллических.
И отсортировано будет, как написал вопрошающий: латиница, кириллица, китай.
Допрусь до работы, получишь картинку, а пока и сам мог бы проверить.
Давай так, щас ты проспоришь и перестанешь хамить, ибо нефиг
2 дек 16, 10:26    [19958601]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest


К сообщению приложен файл. Размер - 107Kb
2 дек 16, 10:46    [19958678]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
o-o
aleks2
пропущено...


Наивняк.
Как ты сравнишь китайский иероглиф Янь и русскую букву А?

Головой то надо думать.

Читать тоже надо уметь. Он сравнивает unicode(), читай постом выше, не поверишь, unicode code point есть и у китайских символов, и у кириллических.
И отсортировано будет, как написал вопрошающий: латиница, кириллица, китай.
Допрусь до работы, получишь картинку, а пока и сам мог бы проверить.
Давай так, щас ты проспоришь и перестанешь хамить, ибо нефиг


Думать, один фиг, надо. И если ты подумаешь - то, что ты долго и мутно писал, суть:

1. Сначала все символы будут преобразованы к Collate XXXXXX, вплоть до выкидывания "непреобразуемых чужих символов".
2. Потом - как обычно.
2 дек 16, 12:11    [19959122]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
AlexanP
Member

Откуда:
Сообщений: 159
А почему корейский символ 45936 оказался впереди китайских (25968,36039) ?
Если Traditional_Spanish_BIN, то отсортирует по уникоду.
2 дек 16, 12:17    [19959152]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
не вижу выкидывания "непреобразуемых чужих символов"
ткни пальчиком, плиз.
вижу обратное: все "непреобразуемые чужие символы" поучаствовали в сортировке.
или как ты объясишь порядок строк, совпадающий с порядком unicode() символов строк,
где вообще никаким испанским даже не пахнет?
как-то не сильно похожа правая упорядоченная картинка на левую неупорядоченную
2 дек 16, 12:21    [19959172]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
AlexanP
Если Traditional_Spanish_BIN, то отсортирует по уникоду.

бин сортирует не по юникоду, а по ascii.
2 дек 16, 12:23    [19959176]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
o-o
AlexanP
Если Traditional_Spanish_BIN, то отсортирует по уникоду.

бин сортирует не по юникоду, а по ascii.
Для юникода есть бин2, ЕМНИП.
2 дек 16, 12:37    [19959230]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
o-o
не вижу выкидывания "непреобразуемых чужих символов"
ткни пальчиком, плиз.
вижу обратное: все "непреобразуемые чужие символы" поучаствовали в сортировке.
или как ты объясишь порядок строк, совпадающий с порядком unicode() символов строк,
где вообще никаким испанским даже не пахнет?
как-то не сильно похожа правая упорядоченная картинка на левую неупорядоченную


Поднимите мне веки!
Ну отсортируй свой пример на всех коллейшенах.
2 дек 16, 12:39    [19959245]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
o-o
пропущено...

бин сортирует не по юникоду, а по ascii.
Для юникода есть бин2, ЕМНИП.
А может, я и приврал...
Засомневался, в общем
2 дек 16, 12:45    [19959279]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
AlexanP
Member

Откуда:
Сообщений: 159
Почему китайский символ БОЛЬШЕ корейского ?

declare @S1 nvarchar(1)
select @S1=N'漢' collate Cyrillic_General_CI_AS -- Китай
select @S1,UNICODE(@S1),ASCII(@S1) -- Корея

declare @S2 nvarchar(1)
select @S2=N'한' collate Cyrillic_General_CI_AS
select @S2,UNICODE(@S2),ASCII(@S2)

if @S1>@S2 select 1 else select 0



Результат:
---- ----------- -----------
漢 28450 63

(1 row(s) affected)

---- ----------- -----------
한 54620 63

(1 row(s) affected)

-----------
1
2 дек 16, 12:46    [19959284]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
сам и отсортируй, твоя очередь.
найди хоть один коллэйшен (кроме бинарных,
про бинарные уже сказали,
bin2 сортирует по кодам юникода,
а обычный bin даже не по ascii, там идет сортировка первого символа по юникоду,
а со второго начиная по "перевернутому" юникоду (инвертированные байты)),
при сортировке с которым порядок будет отличаться от моего.
можешь еще и desc отсортировать, чтобы убедиться, порядок тот, что на моей картинке
2 дек 16, 12:54    [19959324]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
AlexanP
Member

Откуда:
Сообщений: 159
https://msdn.microsoft.com/ru-ru/library/ms179886.aspx
Операторы и параметры сортировки
Операторы сравнения и операторы MAX, MIN, BETWEEN, LIKE, IN выполняются с учетом параметров сортировки. Строке, используемой операторами, присваивается метка параметров сортировки операнда с более высокой очередностью.

Это выражение можно считать "с учетом параметров сортировки" ?
if @S1 collate Cyrillic_General_CI_AS >@S2 collate Cyrillic_General_CI_AS select 1 else select 0
2 дек 16, 13:00    [19959360]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
AlexanP
Почему китайский символ БОЛЬШЕ корейского ?

declare @S1 nvarchar(1)
select @S1=N'漢' collate Cyrillic_General_CI_AS -- Китай
select @S1,UNICODE(@S1),ASCII(@S1) -- Корея

declare @S2 nvarchar(1)
select @S2=N'한' collate Cyrillic_General_CI_AS
select @S2,UNICODE(@S2),ASCII(@S2)

if @S1>@S2 select 1 else select 0



Результат:
---- ----------- -----------
漢 28450 63

(1 row(s) affected)

---- ----------- -----------
한 54620 63

(1 row(s) affected)

-----------
1

от символа имеет смысл считать ascii только в нужном коллэйшене,
у вас везде 63, потому что это вопросительный знак,
это и есть "непреобразуемый чужой символ",
и если бы все было так, как описал aleks2,
то все нелатинские символы превратились бы в вопросики
и строки с полностью отсутствующей латиницей сортировалось бы исключительно учитывая длину строки,
т.е. при преобразовании все символы стали бы вопросиками.
-----------------
не знаю про корейский символ, будет время, поищу.
вот сообщение, где нет того символа, и вот его сортировка при любом collate:

К сообщению приложен файл. Размер - 85Kb
2 дек 16, 13:13    [19959435]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
o-o
сам и отсортируй, твоя очередь.
найди хоть один коллэйшен (кроме бинарных,
про бинарные уже сказали,
bin2 сортирует по кодам юникода,
а обычный bin даже не по ascii, там идет сортировка первого символа по юникоду,
а со второго начиная по "перевернутому" юникоду (инвертированные байты)),
при сортировке с которым порядок будет отличаться от моего.
можешь еще и desc отсортировать, чтобы убедиться, порядок тот, что на моей картинке


Я не занимаюсь фигней, чтобы подтвердить, а тем паче, опровергнуть очевидные вещи.
Это удел слабых мозгом.

ЗЫ. Пример "выкидывания" символа при сортировке есть в ЭТОЙ теме.
2 дек 16, 15:13    [19960151]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
юникод сервер сортирует по кодам юникода,
представленным в двоичном виде,
в соответствии с их хранением в UCS-2, little-endian.
в little-endian байты поменяны местами:
2 байта на символ, но хранятся они не в виде 1-ый2-ой, а в виде 2-ой1-ый.
link below
Because the Intel platform is a little endian architecture, Unicode code characters are always stored byte-swapped

на картинке я перевожу первый символ в бинарный вид.
по идее, перевод обратно в десятичное число должно дать юникодный код символа,
но нет, получается нечто другое.
для правильного перевода надо сперва переставить местами байты.
(пример: Korean 0x30AE --> 0xAE30 --> 44592)
на картинке выделен второй байт.
меняем местами второй и первый, потом сортируем.
это и есть настоящая сортировка но коду юникод.
и этот алгоритм сортировки с правильной перестановкой байтов реализован только в коллэйшенах BIN2:
link below
In a BIN2 collation all characters are sorted according to their code points.
In a BIN collation only the first character is sorted according to the code point, and remaining characters are sorted according to their byte values.

все остальные сортируют юникод неправильно,
разница лишь в том, что BIN-коллэйшен хотя бы в первом символе меняет местами байты,
а оставшиеся даже этого не делают.
----
желающие проверить сортируют с каким угодно (не bin-)коллэйшеном,
выводят бинарное представление символов,
меняют местами первый и второй байты,
убеждаются, что отсортировано именно по первому байту, который хранится вторым
(то, что у меня выделено на картинке)
----
link
Collation and Unicode Support
----
бред алекса про исчезающие юникодные символы даже комментировать не буду, это просто НЕЧТО

К сообщению приложен файл. Размер - 82Kb
2 дек 16, 18:27    [19961095]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
поправка
автор
*убеждаются, что отсортировано именно по первому байту, который хранится вторым

следует читать как:
убеждаются, что отсортировано по второму байту, который хранится первым,
а должно быть отсортировано по первому, который хранится вторым, и только потом по второму
2 дек 16, 18:31    [19961106]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
AlexanP
Member

Откуда:
Сообщений: 159
Что-то совсем запутался.
Я хочу, чтобы мои строки, в которых есть разные символы разных языков, сортировались бы по правилам этих же языков (важно, чтобы CI_AS).
И чтобы был понятным порядок следования одного языка за другим.

Если у меня на базе стоит Cyrillic_General_CI_AS и таблица table T(Name nvarchar(100)) и в таблице нет указания collation, то
как мне написать order by Name ?

Если в "order by" я не указываю collation, то у меня работает правило "Cyrillic_General_CI_AS" ?
Правило "Cyrillic_General_CI_AS" говорит о том, как надо сортировать английский,греческий,французский,китайский,корейский и т.д алфавиты ?
2 дек 16, 22:35    [19961867]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
>>>Если в "order by" я не указываю collation, то у меня работает правило "Cyrillic_General_CI_AS"
да

>>>важно, чтобы CI_AS
Cyrillic_General_CI_AS это обеспечит

>>>И чтобы был понятным порядок следования одного языка за другим
греческий будет собран в одну кучу, факт.
английский, испанский, французский, португальский, -- все, что использует латинский алфавит,
будет перемешано.
равно как и китай-корея-япония, если у них есть общие иероглифы.
если у вас еще есть языки, использующие кириллицу, например, болгарский,
то тоже будет куча, если же русский единственный представитель кириллицы, то отдельная группа будет.
---
коллэйшен в словарь не заглядывает,
а глядя на некоторый набор букв одного и того же алфавита,
невозможно определить язык.
даже имея словарь.
вот burro, это итальянский или испанский?
2 дек 16, 23:58    [19962060]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
AlexanP
Member

Откуда:
Сообщений: 159
А что значит "Cyrillic" для китайских символов ?
Я еще могу понять маленький иероглиф и большой иероглиф (_CI_ или _CS_).
Но что значит "Cyrillic" для этих иероглифов ?


И еще. Можно ли утверждать, что "перемешивание" идет в рамках разделов Unicode (см http://unicode-table.com/ru/blocks/) ?
И уже в другом разделе производится своя сортировка ?

Если раздел "Кириллица"-это 0400-04FF, то правило "Cyrillic_General_XXXXX" работает только для этого раздела или нет ?
3 дек 16, 00:46    [19962177]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
aleks2
Guest
o-o
>>>Если в "order by" я не указываю collation, то у меня работает правило "Cyrillic_General_CI_AS"
да

>>>важно, чтобы CI_AS
Cyrillic_General_CI_AS это обеспечит

>>>И чтобы был понятным порядок следования одного языка за другим
греческий будет собран в одну кучу, факт.
английский, испанский, французский, португальский, -- все, что использует латинский алфавит,
будет перемешано.
равно как и китай-корея-япония, если у них есть общие иероглифы.
если у вас еще есть языки, использующие кириллицу, например, болгарский,
то тоже будет куча, если же русский единственный представитель кириллицы, то отдельная группа будет.
---
коллэйшен в словарь не заглядывает,
а глядя на некоторый набор букв одного и того же алфавита,
невозможно определить язык.
даже имея словарь.
вот burro, это итальянский или испанский?


Много слов - мало толка.

1. Коллэйшн сортирует в соответствии с особенностями национального алфавита, те символы которые принадлежат (описаны) в данном коллэйшн.
2. Сортировка символов коллэйшна, в общем случае, не совпадает с порядком символов в таблице UNICODE. Cоветую посмотреть немецкий и чешский с их умляутами.
3. Все прочие символы (не описанные в коллэйшн), возможно, сортируются по UNICODE-порядку.

ЗЫ. Ежели же в голове каша: "а глядя на некоторый набор букв одного и того же алфавита, невозможно определить язык - ничо не поможет. Язык определять не надо - язык задан выбором коллэйшн.
3 дек 16, 07:25    [19962358]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
aleks2
Ежели же в голове каша: "а глядя на некоторый набор букв одного и того же алфавита, невозможно определить язык - ничо не поможет. Язык определять не надо - язык задан выбором коллэйшн.

вашему вниманию представляется "упорядоченный *по языкам* набор слов" согласно теории алекса:
"язык задан выбором коллэйшн"!!!
+
declare @t table(lang varchar(2), name nvarchar(100));
insert into @t values
('en', N'attachment'),
('fr', N'attach&#233;'),
('de', N'Attacke'),
('es', N'atropello'),
('it', N'attaccabottoni'),
('ru', N'бассейн'),
('bg', N'басейн' ),
('en', N'father'),
('bg', N'баща'),
('de', N'Vater'),
('fr', N'p&#232;re'),
('it', N'pere'),
('it', N'padre'),
('es', N'padre'),
('en', N'water'),
('bg', N'база'),
('ru', N'база'),
('bg', N'бомба'),
('ru', N'бомба'),
('bg', N'кула'),
('ru', N'баба'),
('ru', N'беда'),
('bg', N'беда'),
('ru', N'кукиш');

select *, CAST(name as varbinary(200))
from @t
order by name collate Latin1_General_CI_AS
--order by name collate Cyrillic_General_CI_AS;

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

to aleks2: хоть бы свой бред проверял иногда

К сообщению приложен файл. Размер - 101Kb
3 дек 16, 09:59    [19962446]     Ответить | Цитировать Сообщить модератору
 Re: Как задать 'a-b' < 'aaa' при сортировке?  [new]
o-o
Guest
на картинке сортировка ка с Latin1_General_CI_AS, так и с Cyrillic_General_CI_AS.
это если кому вдруг код на картинке не видно.
в спойлере сам код, желающие могут лично убедиться.
3 дек 16, 10:02    [19962449]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить