如何将mysql二进制(16)密钥转换回十六进制字符串

时间:2015-03-23 23:10:42

标签: mysql

我有一个mysql插件,引发了以下错误:

ERROR 1062 (23000) at line 1: Duplicate entry '\x02L\xA6C\x18 \xAA\xC2K\xBF\xDDX\x97\xFA\xBB6-4.1.3.41' for key 'PRIMARY'

表的主键定义如下:

CREATE TABLE `new_vmv_extended` (
  `variant_hash` binary(16) NOT NULL,
  `pipeline_version` varchar(12) NOT NULL,
  ....
PRIMARY KEY (`variant_hash`,`pipeline_version`)
) 

我理解重复输入问题,我不能为我的生活弄清楚如何将错误消息中的BINARY(16)表示形式转换回32个十六进制数字的原始字符串。

我们在插入上使用mysql的函数unhex('01DA4E4D7EA7D85800FD08A9F09085B1')来生成二进制(16)值。

2 个答案:

答案 0 :(得分:0)

我想我想出来了。从mysql中分解十六进制字符串时我感到很困惑,因为我的编辑器在\ x18之后丢失了空格('')所以我不断提出只有15个字节来转换而不是16.你打破这个字符串如下,其中每行代表一个字节的信息。

    orig hex representation:\x02L\xA6C\x18 \xAA\xC2K\xBF\xDDX\x97\xFA\xBB6

    \x02
    L
    \xA6
    C
    \x18
        <- this is a single space
    \xAA
    \xC2
    K
    \xBF
    \xDD
    X
    \x97
    \xFA
    \xBB
    6

这给了我们16个字节。我不知道如何让mysql直接将其转换回十六进制字符串,但是python可以这样做....

python
>>> from binascii import unhexlify
>>> from binascii import hexlify
>>> a='\x02L\xA6C\x18 \xAA\xC2K\xBF\xDDX\x97\xFA\xBB6'
>>> hexlify(a)
'024ca6431820aac24bbfdd5897fabb36'
>>> unhexlify(hexlify(a))
'\x02L\xa6C\x18 \xaa\xc2K\xbf\xddX\x97\xfa\xbb6'

对我的数据库进行快速测试表明,当此查询找到记录时,转换是正确的。我可以使用上面的hexlify函数的输出作为过滤器的输入。

select * 
from new_vmv_extended
where variant_hash = unhex('024ca6431820aac24bbfdd5897fabb36')
and pipeline_version = '4.1.3.41'

答案 1 :(得分:0)

我对 MySQL 日志进行了一些分析。所以我有一些假设。

重复的条目值是索引值,它不完全匹配行中的原始 BINARY(n) 数据。

我在数据库中找到原始行的最简单方法如下:

例如 MySQL 记录的索引值 '\x08\xD69\x0B\x13\xAB:\x07\xDA\xC5\xDE\xC5a_0\xCD'.
要创建搜索模式,我们应该在每个十六进制分隔符 (\x) 后使用 2 个字符。
上面的例子是这样的:'08%D6%0B%13%AB%07%DA%'

结果查询将与此类似:

SELECT Id
FROM MyTable
WHERE HEX(Id) LIKE '08%D6%0B%13%AB%07%DA%';

查询给我的数据库正好是 1 行。

所有内容均在 MariaDB 10.4 上进行测试。