MySql BLOB 字段排序的问题 如题:BLOB字段是一个结构体,能否根据该结构体中的某个字段对数据表中的所有记录进行排序,或者选出该字段值最大的那条记录?谢谢大家! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以排序,但你想怎么排?这个结构你是如果储存的?create table t5 ( id int primary key, c1 blob);insert into t5 values (1,0x123456);insert into t5 values (2,0x414243);mysql> create table t5 ( -> id int primary key, -> c1 blob -> );Query OK, 0 rows affected (0.06 sec)mysql> insert into t5 values (1,0x123456);Query OK, 1 row affected (0.08 sec)mysql> insert into t5 values (2,0x414243);Query OK, 1 row affected (0.02 sec)mysql> select * from t5;+----+------+| id | c1 |+----+------+| 1 | 4V || 2 | ABC |+----+------+2 rows in set (0.00 sec)mysql> select * from t5 order by c1 desc;+----+------+| id | c1 |+----+------+| 2 | ABC || 1 | 4V |+----+------+2 rows in set (0.05 sec) 额,首先谢谢两位的关注!可能我说的不是太明白,现在再说下:结构体:struct tagRole {INT nID;char szName[32];INT nExp;....};数据表data中Att字段存放的就是上面的那个结构体,当然了Att字段就是上面说的BLOB类型的,现在的问题是如何简便地得到data表中nExp值最大的那条记录?不知道我把问题描述清楚了没有 to ACMAIN_CHM :可能是我没有说太清楚,问题不是对整个BLOB字段排序,是对BLOB字段中的结构体的某个成员(比如nExp)进行排序。BLOB字段中存放的是一个tagRole类型的结构体变量,也只存放这个结构体,其它的东西不存储。 你是如何存储的?!建议你能select blobFld from yourTable然后选几条贴出来,看一下你的表中内容是什么?如果是二进制的 select hex(blobFld) from yourtable然后把对应的实际数据也贴出来,再把你基于这些样例期望的结果也说明一下。 to ACMAIN_CHM : 简化的数据表(myData)结构,bValid, nID, szName, dwCreateTime, Att其中Att是BLOB类型的,它存放的是tagRole类型的变量的二进制形式(汗,我感觉自己表达能力有限...)可能的数据记录如下:1 1 张三 898234312 (1 张三 1000...) 二进制的内容不知道怎么写1 2 李四 898234314 (2 李四 1300...)1 3 王五 898234317 (3 王五 1250...)0 4 赵六 898234301 (4 赵六 2123...)......现在要找出nExp最大的有效记录,比如例子中的李四。问题是Att中的数据都是二进制形式的,并且nExp并不是在Att字段的起始位置,所以直接对Att排序结果是不正确的。实际的数据在公司,我手头上没有,直接select出来的也是不可读的数据,即使贴出来应该也对这个问题没有太大的影响。我觉得已经把这个问题描述清楚了 如果是我,我需要select bValid, nID, szName, dwCreateTime, hex(Att) from yourtable ;这样可以查看 1 张三 1000 对应的BLOB的存储格式是什么。 然后再用 substr或者其它之类的截取算法得到nExp.感觉上。struct tagRole { INT nID; char szName[32]; INT nExp; ....};nID 4 bytes, + szName 32 bytes = 36 bytes, 这样你的 nExp 会是 att[37-40] 但是需要验证。所以需要数据来测试。 恩,这样也可以。现在我们的系统中有个函数,可以将select出来的整个Att用memcpy到一个指向tagRole的指针(外部分配好内存),然后函数外部根据这个指针可以方便的获得nExp的内容。我的想法是遍历myData中所有的记录,依次比较出最大的nExp,自己感觉这种方式比较笨,不知道MySql中有没有类似 select max(nID) from myData这样针对二进制字段形式的语句来使用?nExp在Att中的偏移量是确定的。 你可以直接用 max(substr(hex(att),37,4)) 直接得到。 hex(att)后,计数不再以字节单位计算,而是半个字节(一个hex码)为单位,所以应该是substring(hex(att),73,8)), 这样得到的是二进制数据,还需要转换为当作整数格式才能正确的得到最大值max(reverse(unhex(substring(hex(att),73,8)))),hex,unhex,貌似做了无用功,所以我使用的是max(reverse(mid(att,37,4)))问题解决,结贴。 100分求Mysql 利用二进制恢复 文本文件导入数据到mysql表中 my.ini中的用户名和密码有什么用呀? 求一多次查询的存储过程 数据库导入问题请教 如何获得刚插入数据库的记录的ID号? 关于联合主键的一些疑问 求高人写一个sql查询,万分感谢了 MySql 保存删除了的数据,求方案. 急 mysql中这种表怎么建立?? 高手救命 1000万级数据,mysql能胜任否?
id int primary key,
c1 blob
);insert into t5 values (1,0x123456);
insert into t5 values (2,0x414243);
mysql> create table t5 (
-> id int primary key,
-> c1 blob
-> );
Query OK, 0 rows affected (0.06 sec)mysql> insert into t5 values (1,0x123456);
Query OK, 1 row affected (0.08 sec)mysql> insert into t5 values (2,0x414243);
Query OK, 1 row affected (0.02 sec)mysql> select * from t5;
+----+------+
| id | c1 |
+----+------+
| 1 | 4V |
| 2 | ABC |
+----+------+
2 rows in set (0.00 sec)mysql> select * from t5 order by c1 desc;
+----+------+
| id | c1 |
+----+------+
| 2 | ABC |
| 1 | 4V |
+----+------+
2 rows in set (0.05 sec)
结构体:
struct tagRole {
INT nID;
char szName[32];
INT nExp;
....
};数据表data中Att字段存放的就是上面的那个结构体,当然了Att字段就是上面说的BLOB类型的,现在的问题是如何简便地得到data表中nExp值最大的那条记录?不知道我把问题描述清楚了没有
然后选几条贴出来,看一下你的表中内容是什么?
如果是二进制的 select hex(blobFld) from yourtable然后把对应的实际数据也贴出来,再把你基于这些样例期望的结果也说明一下。
bValid, nID, szName, dwCreateTime, Att其中Att是BLOB类型的,它存放的是tagRole类型的变量的二进制形式(汗,我感觉自己表达能力有限...)可能的数据记录如下:
1 1 张三 898234312 (1 张三 1000...) 二进制的内容不知道怎么写
1 2 李四 898234314 (2 李四 1300...)
1 3 王五 898234317 (3 王五 1250...)
0 4 赵六 898234301 (4 赵六 2123...)
...
...
现在要找出nExp最大的有效记录,比如例子中的李四。问题是Att中的数据都是二进制形式的,并且nExp并不是在Att字段的起始位置,所以直接对Att排序结果是不正确的。实际的数据在公司,我手头上没有,直接select出来的也是不可读的数据,即使贴出来应该也对这个问题没有太大的影响。我觉得已经把这个问题描述清楚了
select bValid, nID, szName, dwCreateTime, hex(Att) from yourtable ;这样可以查看 1 张三 1000 对应的BLOB的存储格式是什么。 然后再用 substr或者其它之类的截取算法得到nExp.感觉上。
struct tagRole {
INT nID;
char szName[32];
INT nExp;
....
};
nID 4 bytes, + szName 32 bytes = 36 bytes, 这样你的 nExp 会是 att[37-40] 但是需要验证。所以需要数据来测试。
恩,这样也可以。现在我们的系统中有个函数,可以将select出来的整个Att用memcpy到一个指向tagRole的指针(外部分配好内存),然后函数外部根据这个指针可以方便的获得nExp的内容。我的想法是遍历myData中所有的记录,依次比较出最大的nExp,自己感觉这种方式比较笨,不知道MySql中有没有类似 select max(nID) from myData这样针对二进制字段形式的语句来使用?nExp在Att中的偏移量是确定的。
hex(att)后,计数不再以字节单位计算,而是半个字节(一个hex码)为单位,所以应该是
substring(hex(att),73,8)),
这样得到的是二进制数据,还需要转换为当作整数格式才能正确的得到最大值
max(reverse(unhex(substring(hex(att),73,8)))),
hex,unhex,貌似做了无用功,所以我使用的是
max(reverse(mid(att,37,4)))问题解决,结贴。