URL 排序规则

Posted

技术标签:

【中文标题】URL 排序规则【英文标题】:Collation for URL 【发布时间】: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:我的理解是,在某些排序规则下,字符对被认为是相等的,但在其他排序规则下却不是。如果我是正确的,这将影响我选择排序规则。 我明白了,我现在发布答案。 【参考方案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 是标识符,我认为它们作为***数据类型的地位是当之无愧的。

以上是关于URL 排序规则的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 排序规则的影响

sqlserver 排序规则的问题

mysql汉字排序规则

MySQL排序顺序 - 排序规则?

DB 排序规则与 Analysis Services 排序规则不同

数据库、表、列排序规则的区别