在varchar(x)
或varbinary(x)
列上设置索引(主要或次要)是否更好?
我不确定它是否重要。然而,我在网上看到的(Googled - varchar vs varbinary)是varchar
几乎已经死亡或被推到路边。那么索引或其他东西更好吗?它可能是索引的类型吗?
优秀方案索引电子邮件地址( [edit] 加密字节数组{varbinary}或字符串等效字符{varchar})
由于
varbinary
上的索引似乎是最糟糕的事情。我读得对吗?
答案 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列,它可能不多。