在MySQL中将存储的md5字符串转换为十进制值

Cfr*_*eak 3 mysql md5 type-conversion

我在MySQL中有一个非常大的表.我正在使用CHAR(32)字段,其中包含MD5作为字符串.我遇到了一个需要使用MySQL将其转换为十进制值的问题.第三方工具运行查询,因此编写代码来执行此操作实际上不是一个选项.

MySQL确实支持本机存储十六进制值并将它们转换为整数.但它会挂起来从字符串中转换它.这是我到目前为止所尝试的内容(md5_key是我的专栏名称)

首先,我只是尝试了UNHEX函数,但返回一个字符串,所以它给了我gooblygoop.我不会把它放在这里.接下来我尝试了CAST功能

SELECT CAST( CONCAT('0x',md5_key) AS UNSIGNED ) FROM bigtable limit 1
Run Code Online (Sandbox Code Playgroud)

结果= 0显示警告给我:"截断的INTEGER值不正确:'0x000002dcc38af6f209e91518db3e79d3'"

但如果我这样做:

SELECT CAST( 0x000002dcc38af6f209e91518db3e79d3 AS UNSIGNED );
Run Code Online (Sandbox Code Playgroud)

我得到正确的十进制值.

所以我想我需要知道的是,有没有办法让MySQL将该字符串视为十六进制值?(我也尝试将其转换为BINARY,然后转换为UNSIGNED,但这也无效).

提前致谢!

ser*_*aut 5

conv()仅限于64位整数.您可以将高和低部分转换为十进制,然后将它们一起添加:

> select cast(conv(substr("000002dcc38af6f209e91518db3e79d3", 1, 16), 16, 10) as
              decimal(65))*18446744073709551616 +
         cast(conv(substr("000002dcc38af6f209e91518db3e79d3", 17, 16), 16, 10) as
              decimal(65));
58055532535286745202684464101843
Run Code Online (Sandbox Code Playgroud)

其中18446744073709551616 = 2 ^ 64.所以在你的情况下:

> select cast(conv(substr(md5_key, 1, 16), 16, 10) as 
              decimal(65))*18446744073709551616 +
         cast(conv(substr(md5_key, 17, 16), 16, 10) as
              decimal(65))
         from bigtable limit 1;
Run Code Online (Sandbox Code Playgroud)