【问题标题】:Enable SQL Server to distingush between - (U+002D) and - (U+FF0D)使 SQL Server 能够区分 - (U+002D) 和 - (U+FF0D)
【发布时间】:2019-12-11 17:06:08
【问题描述】:

如果 SQL Server 设置为将 - (U+002D) 和 - (U+FF0D) 视为同一事物,即

SELECT 
    CASE WHEN 'AB-CD' = 'AB-CD' 
       THEN 'SAME' 
       ELSE 'DIFFERENT' 
    END

会产生“SAME”,有没有办法让它区分这些(通常是所有)字符,即产生“DIFFERENT”?

我无法更改整个环境的设置。

我知道有一个选项可以让一个特定的 SQL 比较区分大小写,即使一般设置不区分大小写,通过声明

SELECT 
    CASE WHEN 'A' = 'a' COLLATE SQL_Latin1_General_CP1_CS_AS 
       THEN 'SAME' 
       ELSE 'DIFFERENT' 
    END

是否有类似的“技巧”让 SQL 对不同的特殊字符“敏感”?

【问题讨论】:

  • “是否有类似的“技巧”让 SQL 对不同的特殊字符“敏感”?” 不,排序规则要么区分大小写,要么区分大小写 不区分大小写。它不能有点区分大小写和有点不敏感。这是一个或另一个。
  • 这些字符是不同大小的连字符。这与区分大小写无关。 collat​​ion 决定这两个连字符是否被认为是相同的。大多数人会认为它们是一样的。如果您不想这样,请改用二进制排序规则,例如Latin1_General_100_BIN2
  • 顺便说一句,所有 SQL__BIN 排序规则都被视为已弃用。
  • @panagiotis-kanavos; @拉努;我知道答案,因为我生活在一个 Unicode 国家。
  • @XAMT 每个人都生活在 Unicode 国家 - 这些字符在美国的行为相同。事实上,它们首先出现在美国创建的文字处理器中。

标签: sql sql-server special-characters


【解决方案1】:

这些字符是不同大小的连字符。这与区分大小写无关。排序规则决定这两个连字符是否被视为相同。大多数人会认为它们是一样的。

如果您不希望这样,您可以改用二进制排序规则,例如 Latin1_General_100_BIN2。二进制排序规则在字节级别比较字符串,并且不应用任何语言规则。

您还应该确保 两个 字符串都是 Unicode,否则长连字符会被普通连字符替换。

此查询将返回SAME

SELECT 
    CASE WHEN N'AB-CD' = N'AB-CD'
       THEN 'SAME' 
       ELSE 'DIFFERENT' 
    END

而这个返回DIFFERENT

SELECT 
    CASE WHEN N'AB-CD' = N'AB-CD' collate Latin1_General_100_BIN2
       THEN 'SAME' 
       ELSE 'DIFFERENT' 
    END

最后,不要使用排序规则with the SQL_ prefix_BIN suffix。它们已被弃用,仅用于向后兼容

【讨论】:

    【解决方案2】:

    答案是 Unicode NVARCHAR 后面的 Big N,数据库设置为像 Persian_100_CI_AS 这样的口音敏感排序规则:

    SELECT 
        CASE WHEN N'AB-CD' = N'AB-CD' 
            THEN 'SAME' 
            ELSE 'DIFFERENT' 
        END
    

    或者您可以在运行时设置 Collat​​e :

    SELECT 
        CASE WHEN N'AB-CD' COLLATE Persian_100_CI_AS = N'AB-CD'  COLLATE Persian_100_CI_AS
            THEN 'SAME' 
            ELSE 'DIFFERENT' 
        END
    

    【讨论】:

    • 这不会改变任何事情。
    • @PanagiotisKanavos;您的数据库应设置为像 Persian_100_CI_AS 一样的 Accent Sensitive 排序规则
    • 更改 database 排序规则不是解决方案。它不会更改任何现有列的排序规则。并且强制使用重音敏感排序规则会破坏大多数查询
    • 仍然是错误的,因为它取决于语言和排序规则。 Latin1_General_CI_AS 将返回 SAME。这两个字符没有重音
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2022-01-08
    • 2012-01-25
    相关资源
    最近更新 更多