【问题标题】:Collation for URLURL 排序规则
【发布时间】:2012-08-15 19:10:30
【问题描述】:

警告:我对数据库排序规则知之甚少,因此如果有任何明显的问题,请提前道歉......

我们有一个包含 url 的数据库列。我们想在这个列上放置一个唯一的约束/索引。

我注意到在默认的数据库排序规则Latin1_General_CI_AS 下,此列中存在欺骗,因为(例如)url http://1.2.3.4:5678/someResourcehttp://1.2.3.4:5678/SomeResource 被认为是相等的。通常情况并非如此...此 url 指向的服务器类型 区分大小写。

对于这样的列,最合适的排序规则是什么?显然区分大小写是必须的,但是Latin1_General?网址是Latin1_General 吗?我不关心字典顺序,但唯一索引/分组的相等性很重要。

【问题讨论】:

  • 为什么您认为排序规则比其他排序规则更好?还不够用 CS ('CS specifies case-sensitive.')?
  • 您是否在插入之前对 URL 进行规范化,例如防止添加http://host1/SomeResourcehttp://host1:80/SomeResource?如果没有,您不会通过添加此约束获得太多收益。
  • @Damien_The_Unbeliever,确实如此。网址在插入前已被完全处理。
  • @danihp:我的理解是,在某些排序规则下,字符对被认为是相等的,但在其他排序规则下却不是。如果我是正确的,这将影响我选择排序规则。
  • 我明白了,我现在发布答案。

标签: sql-server sql-server-2008-r2 collation


【解决方案1】:

您可以alter table为此列设置CS(区分大小写)排序规则:

ALTER TABLE dbo.MyTable 
       ALTER COLUMN URLColumn varchar(max) COLLATE Latin1_General_CS_AS

您也可以在 SQL 语句中指定排序规则:

SELECT * FROM dbo.MyTable
          WHERE UrlColumn like '%AbC%' COLLATE Latin1_General_CS_AS

这是一个short article 供参考。

【讨论】:

    【解决方案2】:

    排序规则中的字母CI 表示不区分大小写。

    对于将是拉丁字符和符号的一小部分的 URL,然后尝试Latin1_General_CS_AI

    【讨论】:

      【解决方案3】:

      Latin1_General 使用代码页 1252 (1),并且 URL 允许的字符包含在该代码页 (2) 中,因此您可以说 URL 是 Latin1_General。

      您只需选择区分大小写的选项Latin1_General_CS_AS

      【讨论】:

        【解决方案4】:

        rfc3986 说:

        ABNF 表示法将其终端值定义为非负数 基于 US-ASCII 编码字符集的整数(代码点) [ASCII]。

        维基百科说允许的字符是:

        Unreserved
        May be encoded but it is not necessary
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
        a b c d e f g h i j k l m n o p q r s t u v w x y z
        0 1 2 3 4 5 6 7 8 9 - _ . ~
        
        Reserved
        Have to be encoded sometimes
        ! * ' ( ) ; : @ & = + $ , / ? % # [ ]
        

        在比较操作中,这些字符之间似乎没有冲突。此外,您可以使用HASHBYTES 函数进行此比较。

        但这种操作并不是主要问题。主要问题是http://domain:80 http://domain 可能相同。同样对于编码字符,url 可能与编码字符不同。

        在我看来,RDBMS 会将这种结构合并为新的数据类型:url、电话号码、电子邮件地址、mac 地址、密码、纬度、经度……。我认为排序规则会有所帮助,但不会解决这个问题。

        【讨论】:

        • 确实...鉴于 Uris 是标识符,我认为它们作为顶级数据类型的地位是当之无愧的。
        猜你喜欢
        • 2012-09-11
        • 2018-12-19
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 2011-11-14
        • 1970-01-01
        • 2012-01-19
        相关资源
        最近更新 更多