2

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

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

我注意到在默认的 db collat​​ion 下Latin1_General_CI_AS,此列中存在欺骗,因为(例如)urlhttp://1.2.3.4:5678/someResourcehttp://1.2.3.4:5678/SomeResource被认为是相等的。通常情况并非如此……此 url 指向的服务器类型区分大小写。

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

4

4 回答 4

1

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

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

于 2012-08-20T13:13:27.137 回答
1

您可以更改表以为此列设置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

这里有一篇短文供参考。

于 2012-08-20T13:14:21.300 回答
1

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

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

于 2012-08-20T13:19:54.850 回答
1

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 地址、密码、纬度、经度……。我认为整理可以帮助但不会解决这个问题。

于 2012-08-20T13:46:39.973 回答