Почему 'œ' соответствует 'oe' в NVarchar, но не в Varchar - PullRequest
0 голосов
/ 04 мая 2018
SELECT REPLACE(N'Chloe', 'œ', 'o'), REPLACE('Chloe', 'œ', 'o')

Результат:

Chlo    Chloe

Это супер странно.


Другой способ:

SELECT
  CASE WHEN N'œ' = N'oe' THEN 1 ELSE 0 END as NVarcharMatch,
  CASE WHEN 'œ' = 'oe' THEN 1 ELSE 0 END as VarcharMatch

Результаты:

NVarCharMatch   VarcharMatch
1   0

1 Ответ

0 голосов
/ 05 мая 2018

Как унаследованные параметры сортировки SQL (префикс сортировки «SQL»), так и двоичные параметры сортировки (префикс «BIN» сравнивают только отдельные символы за раз, поэтому «œ» никогда не может быть равным «oe».

Для сопоставлений Windows и сравнения Unicode используются более надежные правила сравнения. Это позволяет сравнивать отдельный символ «œ» как равный двум последовательным символам «oe», поскольку они семантически идентичны.

--Chlo because Unicode comparison equal
SELECT REPLACE(N'Chloe' COLLATE SQL_Latin1_General_CP1_CI_AS, 'œ', 'o'); 

--Chloe because legacy SQL comparison unequal
SELECT REPLACE('Chloe' COLLATE SQL_Latin1_General_CP1_CI_AS, 'œ', 'o'); 

--Chloe because binary comparison unequal
SELECT REPLACE('Chloe' COLLATE Latin1_General_BIN, 'œ', 'o');

--Chlo because Windows collation comparison equal
SELECT REPLACE('Chloe' COLLATE Latin1_General_CI_AS, 'œ', 'o');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...