Sql 作为散列的主键应该存储为二进制还是字符(十六进制)?

Sql 作为散列的主键应该存储为二进制还是字符(十六进制)?,sql,sql-server,primary-key,Sql,Sql Server,Primary Key,记录由32字节的SHA-2值标识。使用二进制更紧凑(8位/字节vs 4位/字节),但在特殊查询(故障排除等)中使用二进制值的难度增加,抵消了这一点。我倾向于将十六进制字符串存储在64字节字符字段中。除了每个记录4字节32字节的开销之外,还有其他问题或顾虑吗 更新:根据评论,我在SQL 2012中做了一些测试,在涉及二进制键的特殊查询(SSM)中不再有任何“困难”。我在这个问题上的经验有点过时。在SQLServer2000的SSMS中,没有从二进制字符串到十六进制字符串的隐式转换。因此,有必要通过

记录由32字节的SHA-2值标识。使用二进制更紧凑(8位/字节vs 4位/字节),但在特殊查询(故障排除等)中使用二进制值的难度增加,抵消了这一点。我倾向于将十六进制字符串存储在64字节字符字段中。除了每个记录4字节32字节的开销之外,还有其他问题或顾虑吗


更新:根据评论,我在SQL 2012中做了一些测试,在涉及二进制键的特殊查询(SSM)中不再有任何“困难”。我在这个问题上的经验有点过时。在SQLServer2000的SSMS中,没有从二进制字符串到十六进制字符串的隐式转换。因此,有必要通过函数在二进制和十六进制字符串之间显式转换,以获得任何有意义的结果。SQL Server 2005中的情况似乎发生了变化。

我一直在寻找类似于此问题的答案。然而,这是一个在数据库中以二进制或varchar形式存储GUID的问题。不同类型的对象,但原理相同

以下是更多信息:

我还发现了一篇有用的文章,其中比较了使用二进制主键查询数百万行和使用varchar查询数百万行的表的性能。当使用二进制文件时,搜索性能非常好,所以当我知道要处理很多行时,我现在就使用它。不幸的是,我找不到原文


一旦您完成了管理二进制信息的所有设置,就只需要使用varchar了。

64个字符与32个字节相比,每行的开销为32个字节。而每行32字节的开销也可能会转移到二级索引中。键入64个字符的散列字符串总是不好的……如果记录被用于外键引用,那么就为表使用一个标识列,SHA-2值只是一个索引列。@GordonLinoff使用散列作为主键有什么具体原因吗?@MartinSmith这可能已经“解决”了它。我从内存中想,SSMS以ASCII字节序列的形式返回二进制,但自SQLServer2000以来可能就不是这样了。我刚刚运行了一些测试,看起来SSMS中的隐式转换在这两方面都很好,这是唯一有任何临时查询的地方。以减少使用外键时的开销。我还认为,使用内部ID而不是外部ID进行行标识会给数据库增加更多的安全性。这是一个很好的观点,正如@dnoeth所指出的,使用varchar/char的主要方法已经不再适用了。我来自于一些过时的知识(自SQL 2000以来就没有出现过二进制主键的情况)。正如我“深情地”回忆的那样,对二进制字段的选择将返回ASCII(是的,类似于“2&@!Kwk#”)格式,需要使用函数将其转换为十六进制字符串。现在不再是这样了(从SQL 2005开始?)。因此,再加上性能方面的考虑和额外的空间,二进制的情况开始变得相当片面。我在MySQL中也注意到了这一点。当我查询用字符串填充的二进制字段时,它返回了原始格式的字符串。即使它存储为一个水滴。很高兴我能帮上忙。