URL 排序规则
Posted
技术标签:
【中文标题】URL 排序规则【英文标题】:Collation for URL 【发布时间】:2012-08-15 19:10:30 【问题描述】:警告:我对数据库排序规则知之甚少,因此如果有任何明显的问题,请提前道歉......
我们有一个包含 url 的数据库列。我们想在这个列上放置一个唯一的约束/索引。
我注意到在默认的数据库排序规则Latin1_General_CI_AS
下,此列中存在欺骗,因为(例如)url http://1.2.3.4:5678/someResource
和http://1.2.3.4:5678/SomeResource
被认为是相等的。通常情况并非如此...此 url 指向的服务器类型 区分大小写。
对于这样的列,最合适的排序规则是什么?显然区分大小写是必须的,但是Latin1_General
?网址是Latin1_General
吗?我不关心字典顺序,但唯一索引/分组的相等性很重要。
【问题讨论】:
为什么您认为排序规则比其他排序规则更好?还不够用 CS ('CS specifies case-sensitive.')? 您是否在插入之前对 URL 进行规范化,例如防止添加http://host1/SomeResource
和http://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 排序规则的主要内容,如果未能解决你的问题,请参考以下文章