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,但这也无效).
提前致谢!
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)
| 归档时间: |
|
| 查看次数: |
6777 次 |
| 最近记录: |