【问题标题】:Why two strings may compare as equal?为什么两个字符串可以比较相等?
【发布时间】:2020-04-25 23:02:41
【问题描述】:

我正在与=LIKE 进行字符串比较,我在documentation 中找到了这个:

根据排序顺序,两个字符串可能比较相等 即使它们的长度不同或包含不同的序列 的字符。当操作 MAX、MIN、DISTINCT 引用一个 分组列,并且 UNION、EXCEPT 和 INTERSECT 运算符参考 到字符串,这些操作选择的具体值 来自一组这样的相等值是依赖于实现的。

【问题讨论】:

  • 排序规则指定了许多操作如何考虑字符。一些排序规则可能指定不同的排序。其他排序规则可能认为大小写相等,可能会丢弃空格等。

标签: sql sql-server tsql


【解决方案1】:

您要一个具体的例子吗?在德语中,我们有小写字母ß(长度为 1)。在大写中,这个字母通常写成SS(长度为2)。因此,使用不区分大小写的西欧排序规则,以下 SQL

SELECT CASE WHEN 'ß' = 'SS' THEN 'Yes' ELSE 'No' END

将输出Yes,即使字符串的长度不同。

【讨论】:

  • 。 .对我来说,答案更有说服力:CASE WHEN N'ß' = N'SS' THEN 'Yes' ELSE 'No' END
  • @GordonLinoff: 是的,但由于 ß 甚至包含在基于美式英语的系统的默认代码页中,我希望让示例尽可能简单。
【解决方案2】:

排序规则可能对不同的事物敏感。目前,有大小写、重音、假名、宽度和补充字符敏感性。还有二进制排序规则。

因此,对于不区分大小写和重音的排序规则,字符串 N'ABCDEFG'N'äbçdéfg' 将被视为“相同”字符串,尽管它们不共享相同的文字字符。

表情符号是另一个可以将完全不同的字符视为相同的区域。例如下面的返回 1,尽管其中一个字符串包含猫和龙的表情符号,而另一个包含蛋糕的表情符号:

SELECT CASE WHEN N'??' COLLATE SQL_Latin1_General_CP1_CI_AS = N'?' COLLATE SQL_Latin1_General_CP1_CI_AS  THEN 1 END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多