Todos los datos de caracteres en SQL Server están asociados con una clasificación, que determina el dominio de los caracteres que se pueden almacenar, así como las reglas utilizadas para comparar y ordenar datos. La clasificación se aplica tanto a los datos Unicode como a los no Unicode.
SQL Server incluye 3 categorías amplias de intercalaciones: binario, heredado y Windows. Las intercalaciones en la categoría binaria ( _BIN
sufijo) utilizan los puntos de código subyacentes para comparar, por lo que las comparaciones de igualdad devuelven no iguales si los puntos de código difieren independientemente del carácter. Las SQL_
clasificaciones heredadas ( prefijo) y de Windows proporcionan semántica de clasificación y comparación para las reglas de diccionario más naturales. Esto permite que las comparaciones consideren mayúsculas, acentos, ancho y Kana. Las intercalaciones de Windows proporcionan word-sort
reglas más sólidas que se alinean estrechamente con el sistema operativo Windows, mientras que las intercalaciones heredadas solo consideran caracteres únicos.
El siguiente ejemplo ilustra las diferencias entre Windows y la intercalación binaria con el carácter 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;
En http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode se describen las razones por las cuales Unicode puede contener diferentes puntos de código para glifos idénticos . En resumen, puede ser por compatibilidad heredada o los caracteres no son canónicamente equivalentes. Tenga en cuenta que el carácter Teth ﻁ
se usa en diferentes idiomas ( http://en.wikipedia.org/wiki/Teth ).