Todos os dados de caracteres no SQL Server estão associados a um agrupamento, que determina o domínio dos caracteres que podem ser armazenados, bem como as regras usadas para comparar e classificar dados. O agrupamento se aplica aos dados Unicode e Não Unicode.
O SQL Server inclui três grandes categorias de agrupamentos: binário, herdado e Windows. Agrupamentos na categoria binária ( _BIN
sufixo) usam os pontos de código subjacentes para comparar, para que as comparações de igualdade retornem diferentes se os pontos de código diferirem, independentemente do caractere. Os SQL_
agrupamentos herdados ( prefixo) e Windows fornecem semântica de classificação e comparação para as regras de dicionário mais naturais. Isso permite que as comparações considerem maiúsculas e minúsculas, acentos, largura e Kana. Os agrupamentos do Windows fornecem word-sort
regras mais robustas que se alinham ao sistema operacional Windows, enquanto os agrupamentos herdados consideram apenas caracteres únicos.
O exemplo abaixo ilustra as diferenças entre o Windows e o agrupamento binário com o caractere 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;
Os motivos pelos quais o Unicode pode conter pontos de código diferentes para glifos idênticos estão descritos em http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Resumindo, pode ser para compatibilidade herdada ou os caracteres não são canonicamente equivalentes. Observe que o caractere Teth ﻁ
é usado em diferentes idiomas ( http://en.wikipedia.org/wiki/Teth ).