当我想在MySQL数据库中存储SHA1哈希的结果时,我遇到了一个简单的问题:

存储哈希结果的VARCHAR字段应该有多长?

推荐答案

对于可变长度的数据,我会使用VARCHAR,但对于固定长度的数据,我不会使用VARCHAR.因为SHA-1的值是always 160位长,VARCHAR只会浪费an additional byte for the length of the fixed-length field位.

我也不会存储SHA1返回的值.因为它每个字符只使用4位,因此需要160/4=40个字符.但如果每个字符使用8位,则只需要160/8=20个字符长的字段.

所以我建议您使用BINARY(20)UNHEX functionSHA1值转换为二进制.

我比较了BINARY(20)CHAR(40)的存储需求.

CREATE TABLE `binary` (
    `id` int unsigned auto_increment primary key,
    `password` binary(20) not null
);
CREATE TABLE `char` (
    `id` int unsigned auto_increment primary key,
    `password` char(40) not null
);

记录数为binary(20)万张时,binary(20)张需要4456万张,而char(40)张需要6457万张.

Mysql相关问答推荐

将具有多个结果的表连接为新列?

对象NotExecutabletry 在远程SQL服务器上执行SQL时出错,并使用SQLAchemy.Create_engine

为什么我安装MySQL时不能使用3306端口?

Google Sheet查询以提取数据并用值替换复选框.(差异)

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

使用Check查看过go 两个月是否完成了IRM Meetup

如何用sql找出两次之间的差异

按优先级 for each 具有 status_id 的员工 Select 单行

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

分别针对每个不同的列 Select 聚合

在 where 子句中左连接多个值

总行大小不超过 65535,但我得到行大小太大.所用表类型的最大行大小,不包括 BLOB,是 65535错误

将 wordpress 自定义字段转换为单个数组

如何显示患者预约中的专业人员姓名?

如何在 SQL 中的一行中查找最小值和最大值?

如何按给定开始日期和结束日期的月份汇总?

MySQL:在 Select 语句中自动增加临时列

MySQL - 表'my_table'没有被锁定表锁定

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

ON UPDATE RESTRICT 有什么作用?