【发布时间】:2012-08-29 15:08:38
【问题描述】:
我有这个 MSSQL 片段 -
CONVERT(INT, HASHBYTES('MD5', {some_field}))
...我真的很想要一个 MySQL 等价物。我很确定 HASHBYTES('MD5', ...) 位与 MySQL 的 MD5(...) 相同 - 真正让我感到困惑的是 CONVERT(INT, ...) 位。
谢谢。
【问题讨论】:
标签: mysql sql-server
我有这个 MSSQL 片段 -
CONVERT(INT, HASHBYTES('MD5', {some_field}))
...我真的很想要一个 MySQL 等价物。我很确定 HASHBYTES('MD5', ...) 位与 MySQL 的 MD5(...) 相同 - 真正让我感到困惑的是 CONVERT(INT, ...) 位。
谢谢。
【问题讨论】:
标签: mysql sql-server
来自MD5() 函数的 MySQL 手册条目:
该值以 32 个十六进制数字的字符串形式返回,如果参数为
NULL,则返回NULL。
您在上面引用的 MSSQL CONVERT() 函数通过截断最低 4 个字节将其 varbinary 参数转换为有符号的 32 位整数。这有点麻烦,因为 MySQL 算法的工作精度为 64 位。
因此,我们必须取 MySQL 十六进制表示最右边的 8 位数字(表示 4 个最低位字节)并使用 MySQL 的 CONV() 函数转换为十进制,然后对结果进行符号扩展:
CONV(RIGHT(MD5('foo'),8), 16, 10) ^ 0x80000000 - 0x80000000
【讨论】: