【问题标题】:Romanian character 'ă' equals 'a' in SQL Server罗马尼亚字符“ă”在 SQL Server 中等于“a”
【发布时间】:2021-06-01 02:43:35
【问题描述】:

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

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

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

【问题讨论】:

  • 数据库中列的数据类型是什么?您要比较的变量的数据类型是什么?
  • 列和变量都是varchar。
  • “列和变量都是varchar。”我看到我的水晶球今天正在工作。 :)
  • @Larnu 是的 :)

标签: sql-server diacritics


【解决方案1】:

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

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

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

【讨论】:

  • 您能否简要解释一下为什么其他字符(如“â”或“ș”)不会发生这种情况?
  • 因为'â'可以在你正在使用的代码页中表示,而'ș'在代码页中是一个无法识别的字符,所以丢失了(所以表示'?'), @CristisS .
  • 你是对的。完全忘记了这件事。再次感谢!
  • 为此付出我的两分钱,并且以一种非常简单的方式:排序规则名称末尾的“_AS”表示“重音敏感”,这意味着 ă 和 a 被视为不同的字母(与“_AI”相反,意思是“不区分重音”)。并且要成为一个聪明人:CI 的意思是“不区分大小写”,它将 A 和 a 视为相同。 CS(区分大小写)会将它们视为不同的。
  • 这不是问题,@MichaelTobisch。问题不在于排序规则的敏感性,OP is 使用区分重音的排序规则,而是在 OP 尝试的排序规则中 varchar 使用的代码页中缺少字符表示比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多