MySQL SHA2 功能似乎不起作用

bpe*_*kes 3 mysql sha2

我正在使用 MySql 5.5.32 并尝试在业务层中的存储过程中重现一些代码,以便我可以为使用sql. 虽然 SHA2 函数似乎有问题,但也许我遗漏了一些东西:

SELECT length(SHA2("bob", 512))
Run Code Online (Sandbox Code Playgroud)

返回128,不应该是64吗?

SELECT length(SHA2("bob", 256))
Run Code Online (Sandbox Code Playgroud)

它返回 64,所以看起来要么是我遗漏了什么,要么是 SHA2 中存在错误。有任何想法吗?

bpe*_*kes 5

评论是正确的,即使文档说它返回二进制字符串,它返回十六进制编码的字符串。要获得正确的长度,请使用:

SELECT length(unhex(SHA2("bob", 512)));
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 5

在 2005 年为 SHA2() 函数编写了补丁并将其贡献给 MySQL(开发人员然后稍微编辑了我的代码以匹配他们的编码标准)。

该函数始终返回一串十六进制数字,就像 MySQL 中的所有其他哈希函数一样。

您可能正在阅读文档中的此声明:

从 MySQL 5.5.6 开始,返回值是连接字符集中的非二进制字符串。在 5.5.6 之前,返回值是一个二进制字符串。

我可以看到读者会如何认为这意味着它返回二进制字节,但这是一种误解。

这实际上意味着该字符串具有二进制字符集。它仍然是十六进制数字的明文字符串。事实上,MySQL 中的任何哈希函数都不会返回字节字符串,就像在其上运行 UNHEX() 一样,它们都返回十六进制数字字符串。一串十六进制数字的长度是等效二进制字节长度的两倍。

如果您不知道我的意思是二进制字符集,请参阅什么是二进制字符集?

SHA2()在 5.5.6 中更改为使用连接字符集,而其他哈希函数在 5.5.3 中以相同方式更改。