Php 在PostgreSQL中存储SHA1十六进制值

Php 在PostgreSQL中存储SHA1十六进制值,php,postgresql,hex,sha1,Php,Postgresql,Hex,Sha1,这个看似简单的问题对应于MySQL的另一个问题:如何在PostgreSQL数据库中存储由SHA1哈希产生的十六进制值 注意:我意识到我可以使用VARCHAR(40)字段,但这不是很有效,因为数据是十六进制的。此外,我正在使用PHP与数据库交互,因此如果需要,我可以使用PHP函数,但如果是这样,我应该在数据库中存储什么结果?我将存储为bytea,十六进制编码。将人类可读的十六进制数据转换为bytea只需以下步骤: ('\x' || sha1_hex_value)::bytea 这里唯一真正的

这个看似简单的问题对应于MySQL的另一个问题:如何在PostgreSQL数据库中存储由SHA1哈希产生的十六进制值


注意:我意识到我可以使用VARCHAR(40)字段,但这不是很有效,因为数据是十六进制的。此外,我正在使用PHP与数据库交互,因此如果需要,我可以使用PHP函数,但如果是这样,我应该在数据库中存储什么结果?

我将存储为bytea,十六进制编码。将人类可读的十六进制数据转换为bytea只需以下步骤:

  ('\x' || sha1_hex_value)::bytea

这里唯一真正的缺点是,根据你的应用程序框架,你可能会得到一个二进制表示。如果不是,您将获得转义版本,并且取决于转义设置,您可能希望自己将其转换为二进制(如果是十六进制,但您可以去掉值前面的
\x
,并将其用作十六进制)。

“但这不是有效的,因为数据是十六进制的”-嗯,什么?十六进制只是一种人类可读的数据表示形式,其他什么都没有。如果你看到的东西看起来像一个十六进制字符串,这只意味着它是格式化的,如果你正在使用PHP,SHA1哈希不是已经是十六进制了吗?首先为什么要对其进行十六进制编码?
bytea
无疑是存储效率最高的选择。如果您的应用程序框架无法在需要文本时恢复二进制文件,那么如果您发送二进制文件和接收二进制文件,它的性能可能会更好。只需将十六进制解码为md5的实字节,并使用您的语言的参数化查询工具将它们作为
bytea
发送到Pg。