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

unruledboy 阅读:56 2024-09-07 23:24:14 评论:0

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

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

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

SELECT CAST( CONCAT('0x',md5_key) AS UNSIGNED ) FROM bigtable limit 1 

结果 = 0
显示警告给我:“截断不正确的整数值:'0x000002dcc38af6f209e91518db3e79d3'”

但是如果我这样做:
SELECT CAST( 0x000002dcc38af6f209e91518db3e79d3 AS UNSIGNED ); 

我得到正确的十进制值。

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

提前致谢!

请您参考如下方法:

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 

其中 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; 


标签:mysql
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号