MySQL中从BLOB字段提取指定字节转换为整数的方法求助
嘿,这个问题我刚好碰到过!你用MediumBlob打包每秒数据来缩减行数的思路很聪明,但在MySQL里直接操作二进制数据确实容易卡壳。我来给你几个实用的方法,帮你把前2字节转成整数展示出来。
先搞清楚字节序(关键!)
因为你在C#里处理正常,所以得对应C#的字节序:C#里BitConverter.ToInt16默认是小端(Little Endian)(除非你手动指定了大端)。先确认你的数据存储时用的是哪种字节序,这决定了后续的SQL写法。
方法1:用ORD函数计算(直观易懂)
ORD函数可以返回单个字节的十进制值,我们可以通过字节位置的权重来计算16位整数:
如果是小端字节序(C#默认):
SELECT ORD(SUBSTRING(`values`, 1, 1)) + ORD(SUBSTRING(`values`, 2, 1)) * 256 AS int16_value FROM `data` WHERE id = 1; -- 替换成你要查询的记录ID解释:第一个字节是低8位,第二个字节是高8位,所以低字节值加上高字节值乘256就是最终的整数。
如果是大端字节序:
SELECT ORD(SUBSTRING(`values`, 1, 1)) * 256 + ORD(SUBSTRING(`values`, 2, 1)) AS int16_value FROM `data` WHERE id = 1;解释:第一个字节是高8位,第二个是低8位,所以高字节乘256加低字节值即可。
方法2:用HEX+CONV函数转换(适合看十六进制中间结果)
这种方法可以先把二进制转成十六进制字符串,再转成十进制整数:
小端字节序(需要反转字节顺序):
SELECT CONV(CONCAT(HEX(SUBSTRING(`values`, 2, 1)), HEX(SUBSTRING(`values`, 1, 1))), 16, 10) AS int16_value FROM `data` WHERE id = 1;解释:先取第二个字节转十六进制,再取第一个字节转十六进制,拼接后就是小端对应的十六进制值,最后用CONV转成十进制。
大端字节序(直接转换):
SELECT CONV(HEX(SUBSTRING(`values`, 1, 2)), 16, 10) AS int16_value FROM `data` WHERE id = 1;解释:直接把前2字节转成十六进制字符串,再转十进制即可。
验证方法
怎么确定哪种写法适合你?很简单:
- 在C#里取出一条记录的
values字段,用BitConverter.ToInt16(values, 0)得到一个整数(比如假设是1234)。 - 用上面的SQL查询同一条记录,看哪个结果和1234一致,就用对应的写法。
另外提醒一下:MySQL的SUBSTRING函数索引是从1开始的,和C#的0索引不一样,别写错位置哦!
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

