database - postgresql:md5 消息摘要的数据类型?

标签 database postgresql database-design

我想使用某个字符串的MD5 消息摘要作为表的主键。我应该为这样的字段使用什么数据类型?我应该为该字段编写哪些 selectinsert 语句?

最佳答案

作为 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函数或者decodemd5的组合来搜索某个字符串:

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/

相关文章:

database - 全新的应用程序如何向下兼容客户旧的本地数据库?

c# - 使用 C# 使用 CSV 文件填充 DataGridView,并使用结果更新 Access 数据库

postgresql - 用户 "postgres"的 Docker 密码验证失败

postgresql - 如何将 docker 卷从一台机器复制到另一台机器?

mongodb - 使用 MongoDB 进行内容标记

sql - 权限表的性能问题

sql - 如果有一个字段的值应该有不同的类型怎么办?

php - 2 尝试使用mysql将数据插入数据库时​​出错

java - 尝试将数据添加到数据库

arrays - Postgres array_replace() 函数替换子数组