Ukládání a reprezentace postav je jedna věc a vědět, jak je třídit a porovnávat, je věc druhá.
Data Unicode uložená v XML
a N
-typy s předponou v SQL Server, mohou reprezentovat všechny znaky ve všech jazycích (z větší části, a to je jeho cílem) pomocí jediné znakové sady. Tedy pro NCHAR
/ NVARCHAR
data (vynechávám NTEXT
protože by se již neměl používat, a XML
protože to není ovlivněno Collations), kolace nemění, jaké znaky lze uložit. Pro CHAR
a VARCHAR
data, kolace dělají ovlivnit, co lze uložit, protože každé porovnávání ukazuje na konkrétní kódovou stránku, což určuje, co lze uložit v hodnotách 128 - 255.
Nyní, i když existuje výchozí pořadí řazení pro všechny znaky, nemůže fungovat ve všech jazycích a kulturách. Existuje mnoho jazyků, které sdílejí některé / mnoho / všechny znaky, ale mají různá pravidla pro jejich řazení. Například písmeno „C“ je ve většině abeced, které tato písmena používají, před písmenem „D“. V americké angličtině by kombinace „C“ a „H“ (tj. „CH“ jako dvě samostatná písmena) přirozeně předcházela jakýkoli řetězec začínající „D“. Ale v několika jazycích je dvoupísmenná kombinace „CH“ speciální a řadí se po "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!';
Vrátí:
Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!
Chcete-li si prohlédnout příklady pravidel řazení v různých kulturách, podívejte se na:Srovnávací grafy .
V některých jazycích se určitá písmena nebo kombinace písmen rovnají jiným písmenům způsobem, který tomu tak není ve většině ostatních jazyků. Například pouze v dánštině se „å“ rovná „aa“. Ale "å" se nerovná pouze jedinému "a":
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!';
Vrátí:
Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!
To vše je velmi složité a ani jsem se nezmínil o ovládání jazyků se zápisem zprava doleva (hebrejština a arabština), čínština, japonština, kombinování znaků atd.
Pokud chcete mít podrobný přehled o pravidlech, podívejte se na Unicode Collation Algorithm (UCA) . Výše uvedené příklady jsou založeny na příkladech v této dokumentaci, i když se domnívám, že ne všechna pravidla v UCA byla implementována, zejména od porovnávání Windows (porovnání ne začínající SQL_
) jsou založeny na Unicode 5.0 nebo 6.0 v závislosti na operačním systému, který používáte, a na verzi rozhraní .NET Framework, které je nainstalováno (viz SortVersion
podrobnosti).
Tak to Collations dělají. Chcete-li zobrazit všechna kola, která jsou k dispozici, spusťte následující:
SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];