Wszystkie dane znaków w SQL Server są powiązane z sortowaniem, które określa domenę znaków, które mogą być przechowywane, a także zasady stosowane do porównywania i sortowania danych. Sortowanie dotyczy zarówno danych Unicode, jak i innych niż Unicode.
SQL Server obejmuje 3 szerokie kategorie zestawień: binarne, starsze i Windows. Zestawienia w kategorii binarnej ( _BIN
sufiks) wykorzystują bazowe punkty kodowe do porównania, więc porównania równości zwracają nierówne, jeśli punkty kodowe różnią się niezależnie od znaku. Starsze ( SQL_
przedrostek) i sortowanie w systemie Windows zapewniają semantykę sortowania i porównywania dla bardziej naturalnych reguł słownika. Pozwala to na porównania uwzględniające wielkość liter, akcenty, szerokość i Kana. Sortowania w systemie Windows zapewniają bardziej niezawodne word-sort
reguły, które są ściśle dopasowane do systemu operacyjnego Windows, podczas gdy starsze zestawienia uwzględniają tylko pojedyncze znaki.
Poniższy przykład ilustruje różnice między systemem Windows a zestawieniem binarnym ze znakiem Teth:
CREATE TABLE dbo.WindowsColationExample
(
Character1 nchar(1) COLLATE Arabic_100_CI_AS_SC
, Character2 nchar(1) COLLATE Arabic_100_CI_AS_SC
, Character3 nchar(1) COLLATE Arabic_100_CI_AS_SC
, Character4 nchar(1) COLLATE Arabic_100_CI_AS_SC
);
CREATE TABLE dbo.BinaryColationExample
(
Character1 nchar(1) COLLATE Arabic_100_BIN
, Character2 nchar(1) COLLATE Arabic_100_BIN
, Character3 nchar(1) COLLATE Arabic_100_BIN
, Character4 nchar(1) COLLATE Arabic_100_BIN
);
INSERT INTO dbo.BinaryColationExample
VALUES ( NCHAR(65217), NCHAR(65218), NCHAR(65219), NCHAR(65220) );
INSERT INTO dbo.WindowsColationExample
VALUES ( NCHAR(65217), NCHAR(65218), NCHAR(65219), NCHAR(65220) );
--all characters compare not equal
SELECT *
FROM dbo.BinaryColationExample
WHERE
character1 = character2
OR character1 = character3
OR character1 = character4
OR character2 = character3
OR character2 = character4
OR character3 = character4;
--all characters compare equal
SELECT *
FROM dbo.WindowsColationExample
WHERE character1 = character2;
SELECT *
FROM dbo.WindowsColationExample
WHERE character1 = character3;
SELECT *
FROM dbo.WindowsColationExample
WHERE character1 = character4;
SELECT *
FROM dbo.WindowsColationExample
WHERE character2 = character3;
SELECT *
FROM dbo.WindowsColationExample
WHERE character2 = character4;
SELECT *
FROM dbo.WindowsColationExample
WHERE character3 = character4;
Powody, dla których Unicode może zawierać różne punkty kodowe dla identycznych glifów, zostały przedstawione w http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Podsumowując, może to być zgodność ze starszymi wersjami lub znaki nie są kanonicznie równoważne. Zauważ, że znak Teth ﻁ
jest używany w różnych językach ( http://en.wikipedia.org/wiki/Teth ).