我想使用某些字符串的MD5消息摘要作为表的主键。我应该为这样的字段使用什么数据类型?我应该为该字段撰写哪些select
和insert
语句?
答案 0 :(得分:10)
作为bytea
的md5哈希将仅使用16个字节而不是32个用于hexa表示:
create table t (d bytea);
insert into t (d) values
(digest('my_string', 'md5')),
(decode(md5('my_string'), 'hex'));
上述两种表单都可以使用,但要使用更简单的digest
函数,必须以超级用户身份安装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
值是存储大小。与hexa表示相比,bytea
小于一半。
答案 1 :(得分:1)
bytea
有一个字节的开销,但填充到8个字节会导致严重的浪费。
相反,请考虑使用仅使用16个字节的uuid
类型。 1}}在选择时必须使用REPLACE(md5::text, '-', '') as md5
,但这应该是一种快速操作。