【发布时间】:2013-04-05 15:39:27
【问题描述】:
我想使用某个字符串的 MD5 消息摘要作为表的主键。我应该为这样的字段使用什么数据类型?我应该为该领域写什么select 和insert 语句?
【问题讨论】:
标签: database postgresql database-design
我想使用某个字符串的 MD5 消息摘要作为表的主键。我应该为这样的字段使用什么数据类型?我应该为该领域写什么select 和insert 语句?
【问题讨论】:
标签: database postgresql database-design
bytea 的 md5 哈希将仅使用 16 个字节,而不是 32 个字节用于六进制表示:
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 不到一半。
【讨论】:
bytea 有 1 个字节的开销,但填充到 8 个字节会导致大量浪费。
请考虑使用 uuid 类型,它只使用 16 个字节。选择时您必须使用REPLACE(md5::text, '-', '') as md5 之类的东西,但这应该是一个快速操作。
【讨论】:
typalign 值而有所不同,对吧?