SQL Server - 在nvarchar字段上创建索引

15

如何保持 nvarchar 字段的唯一性?我的一个字段存储 MP3 文件的 URL,其长度可以从 10 个字符到 4000 个字符不等。我尝试创建索引,但由于总长度超过 900 字节,无法创建索引。

如果该字段未被索引,则搜索任何内容都会变慢。我正在使用 C#、ASP.net MVC 进行前端开发。


3
由于URL的某些部分区分大小写,而其他部分不区分大小写,因此在数据库中解决这个问题可能并不容易。 - Damien_The_Unbeliever
3个回答

31

你可以使用CHECKSUM命令,并在带有校验和的列上放置索引。

--*** Add extra column to your table that will hold checksum
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO

--*** Create index on new column
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

然后您可以使用以下查询快速检索数据:

SELECT * 
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';

这里是文档:http://technet.microsoft.com/en-us/library/ms189788.aspx


文档中以下这行不是一个问题吗?“CHECKSUM() 不能保证结果唯一。” - Bertvan
2
@Bertvan 这就是为什么仅仅检查校验和是不够的,人们仍然需要查看感兴趣的字段以进行精确匹配。校验和只是帮助缩小行选择范围,这样只有具有冲突校验和的行才需要进行精确匹配的检查。 - Kaspars Ozols

5

您可以使用哈希函数(尽管理论上它不能保证两个不同的标题将具有不同的哈希,但应该足够好:MD5碰撞),然后在该列上应用索引。

SQL Server中的MD5


2
您可以对URL创建一个哈希码,并将此整数用作数据库中的唯一索引。注意首先将所有字符转换为小写,以确保所有URL都以相同的格式呈现。相同的URL将生成相等的哈希码。

哦,URI是区分大小写的... - binki
@binki 不完全是这样的。这取决于后台服务器。RFC规定:“..当比较两个URI以决定它们是否匹配时,客户端应该对整个URI进行区分大小写的逐字节比较”,但“应该”只是一种建议,因此IIS不区分大小写,而Apache则区分大小写。请参见此线程:https://dev59.com/dGUo5IYBdhLWcg3w9TTb - Oscar
那么,如果您不考虑大小写敏感的文件系统或支持大小写敏感的文件服务器上的远程存储,则无法实现可移植性。RFC建议某些事情是有原因的... 如果MP3存储在像imgur或YouTube这样的服务上,其中密钥是区分大小写的base64哈希值,那该怎么办? - binki
@binki 我不是说你错了,但只要这个哈希用于私有实现和索引,而不会在其他地方公开,它就与实际问题无关。 - Oscar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接