【问题标题】:Need a case insensitive collation where ss != ß需要不区分大小写的排序规则,其中 ss != ß
【发布时间】:2012-05-08 06:29:27
【问题描述】:

对于在 SQL Server Express 2012 上运行的数据库中的特定列,我需要一个排序规则,其中在比较字符串时 ss 和 ß 不被视为相同。 ä 和 ae、ö 和 oe 以及 ü 和 ue 也应分别视为不同。 Latin1_General_CI_AS 提供后者,但不区分 ss 和 ß。也就是说,WHERE ThatColumn = 'Fass' 将同时产生 FassFaß

我会坚持使用 BIN/BIN2,但我需要不区分大小写。如果没有其他工作,我将不得不使用 Latin1_General_BIN/Latin1_General_BIN2 并确保自己的所有内容都是大写或小写。这意味着更多的工作,因为我还需要能够检索具有适当大小写的版本。

但如果有符合我需要的排序规则,请告诉我。提前致谢!

更新: 有关要求的更多信息:数据库包含来自仅支持 ASCII 字符的遗留系统的个人姓名。也就是说,像 Müller 和 Faß 这样的名称存储为 Mueller 和 Fass。在新系统中,用户将具有重命名这些人的功能,例如将“穆勒”重命名为“穆勒”。要找到需要重命名的实体,我需要搜索包含例如的行“法斯”。但现在查询也返回“Faß”,这不是我想要的。我仍然需要/想要不区分大小写,因为用户应该能够搜索“fass”并仍然获得“Fass”。

系统还有更多内容,但我可以肯定地说,我需要区分 ss 和 ß、ä 和 ae 等。

【问题讨论】:

  • 这似乎是一个奇怪的要求。任何原因?你能扩展一下吗?只是 ss 和 ß 还是有其他需要特殊处理的连字/特殊字词?
  • 我已经更新了问题。我绝对需要能够区分 ss 和 ß。

标签: sql-server collation


【解决方案1】:

排序规则 SQL_Latin1_General_CP1_CI_AS 认为“ss”与“ß”不同,因此它可能对您有用。这是一个遗留排序规则,因此它可能与操作系统和应用程序平台不兼容。它可能还有其他我不知道的怪癖。

几年前,我针对类似问题草拟了一个笨拙的解决方法,您可以查看它here。 (单击“解决方法 (1)”选项卡。)这种情况下的问题是关于键列的唯一性,而不是字符串比较结果,因此将其应用于您的情况(并比较两列以进行单个字符串比较)可能不可行。

【讨论】:

  • 不,抱歉,SQL_Latin1_General_CP1_CI_AS 不起作用。以下是我的测试方法:pastebin.com/nEKJk7bX
  • 安德烈,我不相信你的测试是足够的。我怀疑数据库排序规则会自动应用于您的 pastebin 示例中的常量字符串,并且没有在列排序规则下进行比较。请参阅此示例:sqlfiddle.com/#!3/d5344/6
  • 啊哈!我现在看到您正在使用 nvarchar。我认为,指定代码页的 SQL 排序规则对您不起作用。如果你必须使用 nvarchar,我想你可能不走运。
  • 你是对的,使用 varchar 它可以工作。在这种特殊情况下,我将不得不检查是否可以使用 varchar。该应用程序不会在国际上使用。
  • 我会接受这个答案。虽然回退到 varchar 的需求当然不是很大,但它现在对我们有用。
猜你喜欢
  • 2015-01-22
  • 2011-06-01
  • 2011-05-11
  • 2011-05-23
  • 2013-12-31
  • 2019-06-19
  • 2014-05-10
  • 2011-01-03
  • 2012-01-12
相关资源
最近更新 更多