SQL Server 中的罗马尼亚字符 'ă' 等于 'a'

问题描述

我正在开发一个存储罗马尼亚语单词的 sql Server 数据库。罗马尼亚语单词可能包含各种特殊字符(变音符号),例如 'ă'、'ș'、'ț'、'î' 或 'â'。我有带和不带变音符号的项目。我注意到如果用户搜索包含“a”的内容,它也会返回不包含“a”但包含“ă”的结果。

有没有办法防止“ă”等同于“a”?

我的数据库使用 sql_latin1_General_CP1_CI_AS 排序规则。

解决方法

这并不是说 a 等于 ă,而是字符串 'ă' 无法在 varchar 中使用您正在使用的排序规则正确表示;因此 'ă' 被表示为 'a'(这并不奇怪,等于 'a')。因此,'ă' does 等于 'a'(使用排序规则 SQL_Latin1_General_CP1_CI_AS),因为在尝试比较之前前一个值已更改。您需要使用 nvarchar:

SELECT CASE N'ă' COLLATE SQL_Latin1_General_CP1_CI_AS WHEN 'a' THEN 1 END;

这将返回 NULL,因为布尔表达式不正确。