Все символьные данные в SQL Server связаны с сопоставлением, которое определяет область символов, которые могут быть сохранены, а также правила, используемые для сравнения и сортировки данных. Сопоставление применяется как к данным Unicode, так и не Unicode.
SQL Server включает в себя 3 широкие категории параметров сортировки: двоичные, устаревшие и Windows. Для сравнения в двоичной категории ( _BIN
суффиксе) используются базовые кодовые точки для сравнения, поэтому сравнения на равенство возвращают неравное значение, если кодовые точки различаются независимо от символа. Преобразования Legacy ( SQL_
префикс) и Windows обеспечивают семантику сортировки и сравнения для более естественных правил словаря. Это позволяет при сравнении учитывать регистр, акценты, ширину и кана. Параметры сортировки Windows предоставляют более надежные word-sort
правила, которые тесно связаны с ОС Windows, тогда как в устаревших параметрах сортировки учитываются только отдельные символы.
Пример ниже иллюстрирует различия между Windows и двоичным сопоставлением с символом 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;
Причины, по которым Unicode может содержать разные кодовые точки для одинаковых символов, описаны в http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Подводя итог, это может быть для унаследованной совместимости или символы не канонически эквивалентны. Обратите внимание, что символ Teth ﻁ
используется на разных языках ( http://en.wikipedia.org/wiki/Teth ).