我有一个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)值。
答案 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 上进行测试。