mariadb/mysql:如何将 BLOB 的/UNPACK 部分转换为整数或双精度等
Posted
技术标签:
【中文标题】mariadb/mysql:如何将 BLOB 的/UNPACK 部分转换为整数或双精度等【英文标题】:mariadb/mysql: How do I convert/UNPACK part of a BLOB to integer or double etc 【发布时间】:2021-01-30 12:31:19 【问题描述】:我使用 mariaDB/mysql 数据库对二进制数据的结构进行“逆向工程”。 一个名为“data”的列包含 152 字节长的二进制“blob”。
在另一列中,我列出了我期望的信息类型: 例如col2: "timestamp" (unix 格式), col3: "size1" uint32, col4: "length" 4 byte float, .... etc.
当我开始时,所有这些列都包含 NULL。
现在我写下一个论点:“data”中 blob 的 byte 8:12 是一个 4 byte int 并解码为“size1”等等。 为了评估我的论文,我想用从“数据”中的 blob 中提取来填写 col3/“size1”。
所以我现在需要的是一个 SQL (mariadb) UPDATE,它从 blob 中提取字节并将其存储在“col3”中。 一列称为“pulse_max”。有了这个效果很好,因为我只需要 1 个字节:
更新字典2 SET pulse_max=ascii(SUBSTRING(data, 147, 1));
但是我怎样才能将 blob 的较大(2、4 字节等)部分“转换”/解包为 int、uint、double、unixtimestamp 等? 像这样的事情失败了:(列“tracklenght”是一个 4 字节的 uint。)
UPDATE dictionary2 SET tracklength= binary(SUBSTRING(data, 113, 4));
==> 警告:#1366 Falscher integer-Wert: '\x94L\xFEE' für Feld 'tracklength' in Zeile 1
更新字典2 SET duration_time=CONV(REVERSE(HEX(substring(data,109,4))),16,10);
==> 这很废话(我的源数据是小端序)。也许这 4 个字节的顺序不对?
我知道我可以使用 C/perl/python/etc 来完成所有这些工作。 (htonl, unpack 等) - 但是这些程序不允许我存储许多数据样本并允许对我的论文进行大规模评估。
当然,我可以使用 python/perl mariadb 连接器。但是我想直接在 SQL 中执行,并将例程存储在数据库中。
【问题讨论】:
欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后edit 您的问题包括您拥有的完整源代码作为minimal reproducible example,其他人可以对其进行测试。有关 SQL 相关问题,另请参阅 meta.***.com/questions/333952/…。 【参考方案1】:好吧,我有一些帖子。我将它们全部删除,因为现在我有一个不错的解决方案。我期望 SQL/mariadb 有一个集成的“功能”。事实并非如此,所以我自己写了。如果您正在寻找类似的解决方案,您就在这里:
如果存在则删除函数 unpackf4; 分隔符 // 创建函数 unpackf4(b BLOB(4)) 返回浮动确定性 开始 声明 f_value FLOAT; DECLARE binstr CHAR(32); SET binstr = LPAD(CONV(HEX(CAST(reverse(b) AS CHAR(10000) 字符集 utf8)),16,2),32,'0'); 设置 f_value = POW(-1,CONV(SUBSTRING( binstr , 1, 1),2,10))* POW( 2,CONV(SUBSTRING( binstr , 2, 8),2,10)-127)* (1+ CONV(SUBSTRING( binstr , 10,23),2,10)/POW(2,23)); 返回 f_value; 结尾; // 分隔符;
使用此功能,您可以简单地将 blob 列“转换/解包”为 float32(double64 类似):
UPDATE dictionary2 SET tracklength = unpackf4(substring(data,113,4));
虽然很明显 DATA 是一个 blob 列,而 tracklenght 是一个浮点列。
【讨论】:
以上是关于mariadb/mysql:如何将 BLOB 的/UNPACK 部分转换为整数或双精度等的主要内容,如果未能解决你的问题,请参考以下文章
如何在CSV导入(MariaDB / MySQL)上生成连锁主键?
Python 和 Scrapy,并试图将抓取的数据放入 MariaDB/MYSQL 数据库
Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象