sql >> Databáze >  >> RDS >> Sqlserver

Jaký je smysl COLLATIONS pro sloupce nvarchar (Unicode)?

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];
 


  1. Instalace SQL Express

  2. INSERT více záznamů pomocí ruby ​​on rails aktivní záznam

  3. Jak vytvořím databázi, pokud neexistuje, pomocí PHP?

  4. php mysql server zmizel