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

标签 mysql sql binary md5

基于各种建议,例如 What data type to use for hashed password field and what length? ,我可以将 md5 存储为 CHAR(32) 或 BINARY(16)。但是当我使用 BINARY(16) 这样做时,存储的值与 CHAR(32) 存储结果的前 16 个字符以及 SELECT MD5() 结果的前 16 个字符相同.后面的 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 来存储校验和而不是十六进制文本的好处是只需要一半的存储空间。

关于mysql - 在数据库中存储 MD5 时 BINARY(16) 和 CHAR(32) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19069744/

相关文章:

mysql - 按选项过滤产品

php - 如何遍历这个数组并得到总和?

sql - 将一个数字分成多个带区

mysql - 将多个参数传递给sql函数

MySQL 优化带有 IN 子句和多个 ID 的 LEFT JOIN

mysql - 即使 where 条件失败,也从表 1 左连接表 2 返回记录

c# - 有没有办法在 C# 中动态生成枚举?

c++ - 声明一个内部有结构数组的结构数组

r - 二进制矩阵中的 1 组群

java - 如何在 Java 中读取一个大的二进制文件