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

最佳答案

传统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');

关于sql-server - 为什么在NVarchar中“œ”与“oe”匹配但在Varchar中为什么不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50181535/

10-10 08:00