Хранение и представление символов - это одно, а знать, как сортировать и сравнивать их - это другое.
Данные Unicode, хранящиеся в файлах XML
и N
-предоставляемых в SQL Server, могут представлять все символы на всех языках (по большей части, и это его цель) с одним набором символов. Итак, для XML
/NCHAR
/NVARCHAR
данных (я ухожу из NTEXT
, так как его больше не следует использовать), в Collations не изменяются символы, которые могут быть сохранены. Для CHAR
и VARCHAR
данным, параметры сортировки сделать влияет то, что могут быть сохранены как каждый COLLATION указывает на конкретной кодовой страницы, которая определяет, что может храниться в значениях 128 - 255.
Теперь, в то время как там вроде по умолчанию порядок для всех персонажей, которые не могут работать во всех языках и культурах. Существует много языков, в которых есть некоторые/многие/все символы, но есть разные правила их сортировки. Например, буква «C» предшествует букве «D» в большинстве алфавитов, которые используют эти буквы. На американском английском языке комбинация «С» и «Н» (т. Е. «СН» как две отдельные буквы) естественно приходила бы перед любой строкой, начинающейся с «D».Но, в нескольких языках, две буквы комбинация «CH» является особенным и сортирует после «D»:
IF ( N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI
AND N'C' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
) PRINT 'Czech_CI_AI';
IF ( N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI
AND N'C' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
) PRINT 'Czech_100_CI_AI';
IF ( N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI
AND N'C' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
) PRINT 'Slovak_CI_AI';
IF ( N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS
AND N'C' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
) PRINT 'Slovak_CS_AS';
IF ( N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS
AND N'C' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
) PRINT 'Latin1_General_100_CI_AS'
ELSE PRINT 'Nope!';
Возвращает:
Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!
Чтобы посмотреть примеры правил сортировки по различные культуры, смотрите: Collation Charts.
Кроме того, на некоторых языках некоторые буквы или комбинации букв приравниваются к другим буквам таким образом, что они не на большинстве других языков. Например, только на датском языке «å» приравнивается к «aa». Но, «А» не равнозначно только один «а»:
IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI
AND N'a' COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI
) PRINT 'Danish_Greenlandic_100_CI_AI';
IF ( N'aa' COLLATE Danish_Norwegian_CI_AI = N'å' COLLATE Danish_Norwegian_CI_AI
AND N'a' COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI
) PRINT 'Danish_Norwegian_CI_AI';
IF ( N'aa' COLLATE Latin1_General_100_CI_AI = N'å' COLLATE Latin1_General_100_CI_AI
AND N'a' COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI
) PRINT 'Latin1_General_100_CI_AI'
ELSE PRINT 'Nope!';
Возвращает:
Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!
Это все очень сложным, и я даже не упомянул обработку для право- (иврит и арабский), китайский, японский, комбинируя символы и т. д.
Если вы хотите получить глубокое понимание правил, ознакомьтесь с Unicode Collation Algorithm (UCA). Приведенные выше примеры основаны на примерах в этой документации, хотя я не верю, что все правила в UCA были реализованы, тем более, что сопоставления Windows (сопоставления не, начиная с SQL_
) основаны на Unicode 5.0 или 6.0, в зависимости от о том, какую ОС вы используете, и версию установленной .NET Framework (подробности см. в разделе SortVersion).
Так вот что делают Collations. Если вы хотите просмотреть все имеющиеся Коллажи, выполните следующие действия:
SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];
Сортировка не означает [прямо] сказать, что можно сохранить. Сортировка определяет порядок и равенство. Например, некоторые сортировки нечувствительны к регистру или нечувствительны к акценту, а другие - нет. –
@pst, если я хранил 'ש', и я делаю« заказ », поэтому он должен заказать по своим символам, который включает' ש'. ..... нет? –
@ user166390 «Сортировка не [прямо] говорит, что можно хранить». не совсем верно. Это верно только для полей 'NVARCHAR' /' NCHAR'. Для полей 'VARCHAR' и' CHAR' Collation действительно определяет, что можно сохранить там, поскольку оно содержит идентификатор LCID, который определяет страницу кода. –