Tutti i dati sui caratteri in SQL Server sono associati a regole di confronto, che determinano il dominio dei caratteri che è possibile archiviare nonché le regole utilizzate per confrontare e ordinare i dati. Le regole di confronto si applicano sia ai dati Unicode che Non Unicode.
SQL Server include 3 ampie categorie di regole di confronto: binario, legacy e Windows. Le regole di confronto nella categoria binaria ( _BIN
suffisso) utilizzano i punti di codice sottostanti per confrontare, quindi i confronti di uguaglianza tornano non uguali se i punti di codice differiscono indipendentemente dal carattere. Le SQL_
regole di confronto legacy ( prefisso) e Windows forniscono la semantica di ordinamento e confronto per le regole del dizionario più naturali. Ciò consente ai confronti di considerare caso, accenti, larghezza e Kana. Le regole di confronto di Windows forniscono regole più solide word-sort
che si allineano strettamente al sistema operativo Windows, mentre le regole di confronto legacy considerano solo singoli caratteri.
L'esempio seguente illustra le differenze tra Windows e le regole di confronto binarie con il carattere 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;
I motivi per cui Unicode può contenere punti di codice diversi per gli stessi glifi sono indicati in http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Riassumo, potrebbe essere per compatibilità legacy o i personaggi non sono canonicamente equivalenti. Nota che il carattere Teth ﻁ
è usato in diverse lingue ( http://en.wikipedia.org/wiki/Teth ).