Alle Zeichendaten in SQL Server sind mit einer Kollatierung verknüpft, die die Domäne der Zeichen bestimmt, die gespeichert werden können, sowie die Regeln, die zum Vergleichen und Sortieren von Daten verwendet werden. Die Sortierung gilt sowohl für Unicode- als auch für Nicht-Unicode-Daten.
SQL Server enthält drei große Kategorien von Kollatierungen: Binär, Legacy und Windows. Kollatierungen in der binären Kategorie ( _BIN
Suffix) verwenden die zugrunde liegenden Codepunkte zum Vergleichen, sodass Gleichheitsvergleiche ungleich zurückgegeben werden, wenn sich die Codepunkte unabhängig vom Zeichen unterscheiden. Legacy- ( SQL_
Präfix-) und Windows-Kollatierungen bieten eine Sortier- und Vergleichssemantik für die natürlicheren Wörterbuchregeln. Dadurch können Vergleiche Groß- und Kleinschreibung, Akzente, Breite und Kana berücksichtigen. Windows-Kollatierungen bieten robustere word-sort
Regeln, die eng mit dem Windows-Betriebssystem übereinstimmen, während ältere Kollatierungen nur einzelne Zeichen berücksichtigen.
Das folgende Beispiel veranschaulicht die Unterschiede zwischen Windows- und Binärsortierung mit dem Teth-Zeichen:
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;
Gründe, warum Unicode unterschiedliche Codepunkte für identische Glyphen enthalten kann, finden Sie unter http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Ich fasse zusammen, es kann aus Gründen der Legacy-Kompatibilität sein oder die Charaktere sind nicht kanonisch gleichwertig. Beachten Sie, dass das Teth-Zeichen ﻁ
in verschiedenen Sprachen verwendet wird ( http://en.wikipedia.org/wiki/Teth ).