【问题标题】:Out of range value while converting MD5 to 2 Bigints in MySql在 MySql 中将 MD5 转换为 2 Bigint 时超出范围值
【发布时间】:2013-04-11 17:45:31
【问题描述】:

在数据库 (MySql) 中,我存储了一些字符串值并在存储它们之前检查这些字符串的唯一性。

对于快速字符串比较(我的意思是在记录之前检查传入的字符串是否已经存在于 DB 中)我想拥有传入的字符串(MD5),将字符串分成 2 个相等的部分,将它们转换为 2 个 bigint,存储它们与字符串一起分开,当记录请求到达时,我想在多列索引中搜索这两个 bigint。 (当然我会得到传入的字符串,MD5那个字符串,计算2个bigint部分然后查询数据库)

但下面的“第 3 行”在我的“MySql 例程”中产生了一个有趣的错误。

...
declare mystring varchar(3000); -- line 1
declare md5bigint1value bigint; -- line 2
...

set md5bigint1value = conv(substring((md5(mystring)),1,16),16,10); -- line 3
...

在“第 3 行”显示:错误代码:1264。第 1 行的列“md5bigint1value”的值超出范围

有人知道为什么会这样吗?

如果您需要更多信息,请告诉我。 非常感谢。

【问题讨论】:

    标签: mysql md5 bigint


    【解决方案1】:

    CONV,当与正 to_base 一起使用时,转换为无符号值,而 BIGINT 是有符号的。无符号 64 位值不一定适合有符号 64 位变量。

    如果 to_base 为负数,则将 N 视为有符号数。否则,N 被视为无符号。

    您想要做的是使用-10 作为目标基地,即;

    set md5bigint1value = conv(substring((md5(mystring)),1,16),16,-10); -- line 3
    

    SQLfiddle to test with(10 不起作用,-10 会)。

    【讨论】:

    • 非常感谢!我刚刚改变了我的例程,它就像一个魅力。这个答案肯定被接受!
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多