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

标签 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

结果 = 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 - 在 MySQL 中将存储的 md5 字符串转换为十进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1924850/

相关文章:

md5 - 8051 MCU 的 SHA1 实现?

type-conversion - Camel : how to set boolean header parameter using simple comparison?

javascript - 将 JavaScript 数字 n 转换为字符串 s,使得 Object.is(eval(s), n) 对于所有 n?

php - 在 MySQL 中计数

php - 在一个 html 页面中从 mysql 开始结束日期和下拉菜单

java - 缓慢的读取查询导致其他 c3p0 线程在 acquireStatement 上阻塞

dart - Dart 和 Vuforia 的 VWS API 中的 Base64 HMAC-SHA1 和 MD5 加密

android - 如何从 Java 的 keytool 获取 MD5 指纹,而不仅仅是 SHA-1?

java - 将字符串值转换为 ASCII

mysql - 数据库设计 : use composite key as FK, 标志数据共享?