SQL Server索引 - varchar(100)vs varbinary(100)? [转换数据]

时间:2015-05-29 23:58:08

标签: sql-server indexing sql-server-2008-r2 varchar varbinary

varchar(x)varbinary(x)列上设置索引(主要或次要)是否更好?

我不确定它是否重要。然而,我在网上看到的(Googled - varchar vs varbinary)是varchar几乎已经死亡或被推到路边。那么索引或其他东西更好吗?它可能是索引的类型吗?

优秀方案索引电子邮件地址( [edit] 加密字节数组{varbinary}或字符串等效字符{varchar})

由于

?回答

varbinary上的索引似乎是最糟糕的事情。我读得对吗?

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/35b61bb0-1fa8-4a2f-a9fb-729a1874dcf8/clustered-index-on-a-varbinary-column

2 个答案:

答案 0 :(得分:1)

最好在varchar上创建索引而不是varbinary。 Varbinary适用于blob,但你也可以在varbinary中存储字符串。这些blob与您的实际数据互补。你自己的研究也会得出这个结论。

用户可以用各种格式输入电子邮件地址 - abc@xyz.com或Abc@Xyz.com等。在varchar字段中存储/提取此类信息更容易。 Joe Enos绝对正确,二进制比较将区分大小写(比较二进制信息),而varchar将不区分大小写,假设您已经设置了数据库和列排序规则。使用varbinary,您还必须是careful about padding

Varchar活得健康。索引varchar(100)时,尝试使用非聚集索引。我的一般偏好是在大多数情况下使用代理键作为聚集索引。

答案 1 :(得分:0)

要使用的正确数据类型由列的内容决定。

  

在加密电子邮件地址时,我有一个字节数组

这是二进制数据,应存储为varbinary(除非加密例程输出固定长度数组,然后使用binary)。

varbinary转换为varchar在存储方面完全没有任何好处(无论如何都将所有内容存储为二进制文件)并且可能会导致错误的结果。

以下全部在我的默认排序规则中返回“是”

SELECT 
       CASE
         WHEN cast(0xE6 AS VARCHAR(20))  = cast(0x6165 AS VARCHAR(20))
           THEN 'yes' else 'no'
       END,
       CASE
         WHEN cast(0xcc0000 AS VARCHAR(20))  = cast(0xcc2020 AS VARCHAR(20))
           THEN 'yes' else 'no'
       END,
       CASE
         WHEN cast(0x202020 AS VARCHAR(20)) = cast(0x AS VARCHAR(20))
           THEN 'yes' else 'no'
       END

添加COLLATE LATIN1_GENERAL_BIN会改变前两个但不是第三个的结果。

我希望查找varbinary(n)列比查找varchar(n)列更快,因为比较例程更简单,但对于具有二进制排序规则的varchar列,它可能不多。