【发布时间】:2016-10-25 16:00:05
【问题描述】:
在 MySQL 中有一个名为 UNHEX 的函数,它接受一个类似 '1DB8948899F511E6A18374D02B45FC30' 的字符串并将其转换为一个位序列,一个二进制字段。这是我用来存储UUIDs 的。反向操作在函数HEX中实现。
我存储蛋白质序列,每个蛋白质序列是有限的字母序列,最多有 21 个不同的字母。我不想将每个序列存储为明文,而是将它们存储为二进制字段。
因此我想实现一个自定义函数,类似于UNHEX,它将每个字母替换为给定的 5 位序列(这个位数就足够了)。我也会执行倒数。
如何实现这样的功能?
我研究了函数COMPRESS,但是当在长度约为 63、64 的序列上运行时,它提供了更长的输出,并且长度低于 150 的序列的压缩因子小于我所使用的 1.6 压缩因子可以用我的自定义功能来实现。长度小于150的序列很多,所以我用COMPRESS这个函数不会有太大收获。
我的 MySQL 版本是 14.14 Distrib 5.5.52,适用于 debian-linux-gnu (x86_64),您可以将蛋白质序列视为从 A 到 U 的有限字母序列(实际字母在这里不相关,我将调整代码)。
我想做的是一个函数,它将由从 A 到 U 的这些字母组成的字符串作为参数,并将它们转换为位序列。因为2^4 < 21 <= 2^5,每个字母需要5位,就足够了。
我正在考虑为 MySQL 制作一个插件来定义这两个函数。我走得太远了吗?有没有更简单的方法?如果是这样,这些功能是否会通过编程到插件中来提高效率?
【问题讨论】:
-
请注意,您已将
HEX()和UNHEX()描述为倒退。HEX()将每字节 8 位的二进制数据解包为每字节 4 位的十六进制,UNHEX()将每字节 4 位的十六进制编码数据打包为每字节 8 位字节的二进制数据。 -
对于您的用例,21 个符号字母表中的符号是什么?是字母 A 到 U 还是别的什么?还?什么版本的 MySQL?
-
我建议看看 base64_encode / decode 函数是如何实现的,因为它们使用 6 位。另外,如何转换为数字基数 32?
-
谢谢瑞恩。我找到了这个链接:github.com/y-ken/mysql-udf-base64/blob/master/base64.c,我会调查一下。我认为它回答了我的问题。
标签: mysql string binary data-conversion