2012-03-18 2 views
10

IVe много прочитал об этом.В чем смысл COLLATIONS для столбцов nvarchar (Unicode)?

Еще несколько вопросов:

Я не говорю о том случае чувствительной здесь ...

  • Если у меня есть символ (ש, например), и он хранится в nvarchar - которые могут держать что-нибудь , Зачем мне здесь collation?

  • Если я «FaceBook» и мне нужна возможность хранить allall символов из языков, Какова взаимосвязь между обобщению и моих NVARCHAR столбцов?

Заранее спасибо.

+5

Сортировка не означает [прямо] сказать, что можно сохранить. Сортировка определяет порядок и равенство. Например, некоторые сортировки нечувствительны к регистру или нечувствительны к акценту, а другие - нет. –

+0

@pst, если я хранил 'ש', и я делаю« заказ », поэтому он должен заказать по своим символам, который включает' ש'. ..... нет? –

+0

@ user166390 «Сортировка не [прямо] говорит, что можно хранить». не совсем верно. Это верно только для полей 'NVARCHAR' /' NCHAR'. Для полей 'VARCHAR' и' CHAR' Collation действительно определяет, что можно сохранить там, поскольку оно содержит идентификатор LCID, который определяет страницу кода. –

ответ

8

Хранение и представление символов - это одно, а знать, как сортировать и сравнивать их - это другое.

Данные 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]; 
6

Если у вас есть один символ, тогда никакого заказа нет. Но если вы заказываете, например, НАЗВАНИЯ ЛЮДЕЙ - разные специальные символы на разных языках упорядочены по-разному в зависимости от сортировки.

Сначала сортировка может быть чувствительной к регистру - показать все B до b - а вторые специальные символы имеют специальные правила в зависимости от сортировки.

Документация довольно хороша.

+0

Как может sql сортировать английский, арабский, иврит вместе? нет общей логики ...? пожалуйста, объясните –

+0

Вы можете, если вы невежественны. И используйте, например, английский форт-порядок везде. Это не обязательно правильно. http://www.sqlservercentral.com/blogs/rocks/2012/01/09/revised-difference-between-collation-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as/ имеет один пример (испанский). ou думаю, что MS - идиоты? http://msdn.microsoft.com/en-us/library/ms144250.aspx имеет все сопоставления, и LOT из них являются специфичными для langauge. Вы думаете, что они делают это без причины? Нет, поэтому положение специальных символов в порядке сортировки зависит от языка. – TomTom

6

Я думаю, что исходный плакат путается между СТРАНИЦАМИ И КОЛЛЕКЦИЯМИ.

«n» в nvarchar/nchar позволяет хранить текст, используя набор номеров Unicode, который достаточно велик, чтобы включить все символы на всех языках (в принципе, в любом случае) с уникальным номером. Это само по себе не связано с сопоставлениями. nvarchar/nchar не использует CODE PAGES для кодирования/декодирования значения каждого символьного кода.

Коллажи определяют порядок сортировки символов и варианты символов должны рассматриваться как идентичные. nvarchar/nchar Использует COLLATIONS для определения этих различий.

 Смежные вопросы

  • Нет связанных вопросов^_^