我正在使用 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 中存在错误。有任何想法吗?
评论是正确的,即使文档说它返回二进制字符串,它返回十六进制编码的字符串。要获得正确的长度,请使用:
SELECT length(unhex(SHA2("bob", 512)));
Run Code Online (Sandbox Code Playgroud)
我在 2005 年为 SHA2() 函数编写了补丁并将其贡献给 MySQL(开发人员然后稍微编辑了我的代码以匹配他们的编码标准)。
该函数始终返回一串十六进制数字,就像 MySQL 中的所有其他哈希函数一样。
您可能正在阅读文档中的此声明:
从 MySQL 5.5.6 开始,返回值是连接字符集中的非二进制字符串。在 5.5.6 之前,返回值是一个二进制字符串。
我可以看到读者会如何认为这意味着它返回二进制字节,但这是一种误解。
这实际上意味着该字符串具有二进制字符集。它仍然是十六进制数字的明文字符串。事实上,MySQL 中的任何哈希函数都不会返回字节字符串,就像在其上运行 UNHEX() 一样,它们都返回十六进制数字字符串。一串十六进制数字的长度是等效二进制字节长度的两倍。
如果您不知道我的意思是二进制字符集,请参阅什么是二进制字符集?
SHA2()在 5.5.6 中更改为使用连接字符集,而其他哈希函数在 5.5.3 中以相同方式更改。