我使用的是MySql 5.5.32,并尝试在业务层的存储过程中重现一些代码,这样我就可以为使用sql的用户设置密码。虽然看起来SHA2函数有问题,但我可能遗漏了一些东西:
SELECT length(SHA2("bob", 512))返回128。不是应该是64吗?
SELECT length(SHA2("bob", 256))它返回64,所以看起来不是我遗漏了什么,就是SHA2中有一个bug。有什么想法吗?
发布于 2014-03-02 06:42:35
注释是正确的,即使文档说它返回二进制字符串,它也返回十六进制编码的字符串。要获得正确的长度,请使用:
SELECT length(unhex(SHA2("bob", 512)));发布于 2014-03-02 07:31:32
我对patch for the SHA2() function in 2005进行了编码,并将其贡献给了MySQL (开发人员随后对我的代码进行了一些编辑,以符合他们的编码标准)。
该函数总是返回一个十六进制数字字符串,就像MySQL中的所有其他散列函数一样。
您可能正在阅读文档中的以下语句:
从MySQL 5.5.6开始,返回值是连接字符集中的非二进制字符串。5.5.6之前,返回值为二进制串。
我可以理解读者如何认为这意味着它返回二进制字节,但这是一个误解。
这实际上意味着字符串有一个二进制字符集。它仍然是十六进制数字的明文字符串。事实上,MySQL中的散列函数都不会返回字节字符串,就像对它运行UNHEX()一样,它们都返回十六进制数字字符串。十六进制数字字符串的长度是等效二进制字节长度的两倍。
如果您不知道我所说的二进制字符集,请参阅What is binary character set?
SHA2()在5.5.6中是changed to use the connection character set,而其他散列函数在5.5.3中以相同的方式进行了更改。
发布于 2014-03-02 07:08:42
SHA2(str, hash_length)函数返回一个非二进制字符串。以前,MySQL中的SHA2函数返回一个二进制字符串的值。
从我提供的链接中的文档:
从MySQL 5.5.6开始,返回值是连接字符集中的非二进制字符串。
我们可以通过下面的SELECT语句分析所有这些内容:
SELECT SHA2("bob", 256) AS 'Hashed String',
UNHEX(SHA2("bob", 256)) AS 'Binary String',
LENGTH(UNHEX(SHA2("bob", 256))) AS 'Byte Count'通过MySQL工作台,输出将产生以下结果:

每条评论的更新:
UNHEX(str)函数在文档中声明,它将输入字符串中的每对字符解释为十六进制数字。至于输入字符串是二进制还是非二进制,文档在这里为我们回答了这个问题:
如果UNHEX()的参数是二进制列,则可能出现NULL结果,因为值在存储时会填充0x00字节,但在检索时不会删除这些字节。
https://stackoverflow.com/questions/22104794
复制相似问题