当前位置: 首页 > 面试题库 >

在数据库中存储MD5时BINARY(16)和CHAR(32)之间的区别

柳经纶
2023-03-14
问题内容

基于各种建议,例如用于哈希密码字段的数据类型和长度?,我可以将md5存储为CHAR(32)或BINARY(16)。但是,当我使用BINARY(16)这样做时,存储的值与CHAR(32)存储的结果的前16个字符以及结果的前16个字符相同SELECT MD5()。后16个字符的含义是什么?它们在二进制列中的缺失会导致数据丢失吗?

CREATE  TABLE test (id INT NOT NULL AUTO_INCREMENT, value VARCHAR(6), md5_char CHAR(32) NOT NULL, md5_binary BINARY(16) NOT NULL, PRIMARY KEY (id)) ENGINE = InnoDB;
INSERT INTO test(value,md5_char,md5_binary) VALUES("one!",md5("one!"),md5("one!"));
INSERT INTO test(value,md5_char,md5_binary) VALUES("two%",md5("two%"),md5("two%"));
INSERT INTO test(value,md5_char,md5_binary) VALUES("three~",md5("three~"),md5("three~"));
SELECT value,md5(value),md5_char,md5_binary FROM test;
DROP TABLE test;

+--------+----------------------------------+----------------------------------+------------------+
| value  | md5(value)                       | md5_char                         | md5_binary       |
+--------+----------------------------------+----------------------------------+------------------+
| one!   | 633c8403325f1cf963809e6eb224d77e | 633c8403325f1cf963809e6eb224d77e | 633c8403325f1cf9 |
| two%   | 48bbec047b4451a2018e0f652807b7d0 | 48bbec047b4451a2018e0f652807b7d0 | 48bbec047b4451a2 |
| three~ | fee453bb4eb68dcdfee07575e75c8cc5 | fee453bb4eb68dcdfee07575e75c8cc5 | fee453bb4eb68dcd |
+--------+----------------------------------+----------------------------------+------------------+

问题答案:

目前,您使用时会丢失一半的校验和BINARY(16)。当您将MD5校验和存储在其中时BINARY(16),应将其存储为二进制数据, 而不
是以十六进制编码。那是:

INSERT INTO test (md5_binary) VALUES(UNHEX(md5("one!")));

如果您想将其与另一个校验和进行比较,可以使用HEX函数再次将其编码为十六进制:

SELECT HEX(md5_binary) FROM test;

使用BINARY而不是十六进制文本存储校验和的好处是需要一半的存储空间。



 类似资料:
  • 本文向大家介绍内存和存储之间的区别,包括了内存和存储之间的区别的使用技巧和注意事项,需要的朋友参考一下 记忆 内存允许短期存储数据。存储器通常由寄存器组成。每个寄存器都有一个称为存储位置或存储位置的位置。每个存储位置均由一个地址标识。内存容量由否决定。内存可以存储的位数。内存分为三种主要类型: 高速缓存存储器 主记忆 二级记忆 存储 存储允许长期存储数据。只要程序需要数据,就将数据从存储器复制到内

  • 问题内容: 我对docker注册表和存储库之间的差异感到困惑。似乎Docker文档会交替使用这两个词。另外,存储库有时也称为图像,例如其文档中的图像: 为了将存储库推送到其注册表,您需要已命名映像或将容器提交到已命名映像,如此处所示。 现在,您可以将此存储库推送到由其名称或标记指定的注册表。 如何将存储库推送到注册表?您不是将映像推送到存储库吗? 问题答案: Docker注册表是一项用于存储Doc

  • 本文向大家介绍数据库和区块链之间的区别,包括了数据库和区块链之间的区别的使用技巧和注意事项,需要的朋友参考一下 数据库 数据库表示由表,用于存储用户和系统信息的模式组成的数据结构。它提供了用于创建,读取,删除和更新其记录的SQL。DBMS,数据库管理系统管理数据库。通常,数据库管理员会修改敏感数据。数据库遵循客户端-服务器模型架构。 区块链 区块链代表类似于数据库记录的区块链。该链随着在操作期间向

  • 问题内容: 我只是在想,是否可以使用Swift将时间存储在Firebase中?我之所以问是因为我要创建一个应用程序,当我创建一个特定的对象时,该对象将启动一个计时器,该计时器从创建之日起24小时开始递减计数。这24小时到期后,该对象将被删除。我还想显示一个倒数计时器,以显示该对象在删除之前还剩下多长时间。 我尝试将小时和分钟作为整数存储到数据库中,但这似乎效率不高,因为我不得不担心AM / PM,

  • 问题内容: 当我运行以下代码时,我得到了数组的地址: 但是,当我声明一个字符数组并以相同的方式打印它时,它将为我提供数组的实际内容。为什么? 问题答案: 类(即类)具有专用的方法重载,可打印char数组的字符。 对于其他数组,它没有特殊的重载,因此,当您传递时,被调用的方法是。该方法通过调用其方法将传递的对象转换为字符串。 所有数组的方法都只是从class继承的默认数组,它显示了它们的类名和默认哈

  • 问题内容: 让我解释一下:我并不是在问将特定日期时间的时区存储在数据库中的正确方法。我说的是时区本身。例如: 我有一个名为“用户”的MySQL表。现在,在此表上,我希望有一列包含用户居住地的时区(由用户提供,将从列表中选择)。我正在使用PHP,其中包含类似以下时区字符串的列表: 美国时区列表 现在,显而易见的解决方案(至少对我而言)是在“用户”表中创建VARCHAR列,然后将PHP使用的时区字符串

  • 本文向大家介绍数据仓库和运营数据库之间的区别,包括了数据仓库和运营数据库之间的区别的使用技巧和注意事项,需要的朋友参考一下 数据仓库是用于结构化,经过过滤的数据的存储库,该数据已针对特定目的进行了处理。数据软件从多个来源收集数据,并使用ETL流程转换数据,然后将其加载到数据仓库中以用于业务目的。 运营数据库是那些数据经常更改的数据库。它们主要设计用于大量数据交易。它们是数据仓库的源数据库,用于维护

  • 问题内容: 这两个命令有什么区别? 我想存储约500万个整数,并且希望以最有效的方式进行存储。 问题答案: 不,没有区别;两者都存储为字符串。从redis.io: Redis列表只是字符串列表,按插入顺序排序。 根据您的用法,您可能需要考虑使用set而不是列表。