【问题标题】:MySQL - Implementing a function encoding a string into a binary fieldMySQL - 实现将字符串编码为二进制字段的函数
【发布时间】: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


【解决方案1】:

我需要适配函数base64encode和base64decode。 这些函数的来源可以在这里找到:

https://github.com/y-ken/mysql-udf-base64/blob/master/base64.c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2015-02-27
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多