【问题标题】:MySQL equivalent of MSSQL CONVERT()MySQL 相当于 MSSQL CONVERT()
【发布时间】:2012-08-29 15:08:38
【问题描述】:

我有这个 MSSQL 片段 -

CONVERT(INT, HASHBYTES('MD5', {some_field}))

...我真的很想要一个 MySQL 等价物。我很确定 HASHBYTES('MD5', ...) 位与 MySQL 的 MD5(...) 相同 - 真正让我感到困惑的是 CONVERT(INT, ...) 位。

谢谢。

【问题讨论】:

    标签: mysql sql-server


    【解决方案1】:

    来自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
    

    【讨论】:

    • 可悲的是,这一切似乎都导致零,这不是 MSSQL 产生的。
    • @Jez:请参阅上面的更新答案。现实情况是,您可能不应该这样做,尤其是在安全应用程序中,因为您在转换过程中丢失了 75% 的哈希值。
    • @Jez:我已经停止摆弄了!上一个版本返回的结果不正确,其中值应该是正数。我认为这个版本是最佳的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2014-08-01
    • 2016-01-01
    • 2013-11-28
    • 1970-01-01
    • 2011-06-26
    • 2013-03-20
    相关资源
    最近更新 更多