我想使用某个字符串的MD5 消息摘要作为表的主键。我应该为这样的字段使用什么数据类型?我应该为该字段编写哪些 select
和 insert
语句?
最佳答案
作为 bytea
的 md5 哈希将仅使用 16 个字节而不是 32 个字节用于六进制表示:
create table t (d bytea);
insert into t (d) values
(digest('my_string', 'md5')),
(decode(md5('my_string'), 'hex'));
以上两种形式都可以使用,但要使用更简单的 digest
函数,必须以 super 用户身份安装 pgcrypto
扩展:
create extension pgcrypto;
如上使用digest
函数或者decode
和md5
的组合来搜索某个字符串:
select
octet_length(d) ba_length,
pg_column_size(d) ba_column,
encode(d, 'hex') hex_representation,
octet_length(encode(d, 'hex')) h_length,
pg_column_size(encode(d, 'hex')) h_column
from t
where d = digest('my_string', 'md5')
;
ba_length | ba_column | hex_representation | h_length | h_column
-----------+-----------+----------------------------------+----------+----------
16 | 17 | 3d212b21fad7bed63c1fb560c6a5c5d0 | 32 | 36
16 | 17 | 3d212b21fad7bed63c1fb560c6a5c5d0 | 32 | 36
pg_column_size
值是存储大小。与六进制表示相比,bytea
不到一半。
关于database - postgresql:md5 消息摘要的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982737/