mysql查询二进制数据

是要不要骑牛您 2011-07-07 03:56:09
有个库结构:
CREATE TABLE `hanzhiku` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`sj` binary(20) NOT NULL,
PRIMARY KEY (`id`,`sj`)
) ENGINE=InnoDB AUTO_INCREMENT=22304 DEFAULT CHARSET=gbk;
我希望实现的查询是:
提供一个20比特的二进制数据,查询与这个二进制数最接近的数据
具体算法:把两个二进制数进行异或操作,得到的数值中1的数量最小.
...全文
433 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mr_piao 2011-07-11
  • 打赏
  • 举报
回复
关注一下,
可以用内置函数解决超长数据的问题,
可是我不懂这个,提个建议,看版主的发挥了
tuyi911 2011-07-09
  • 打赏
  • 举报
回复
高,实在是高!
ACMAIN_CHM 2011-07-09
  • 打赏
  • 举报
回复
为什么楼主不愿意给出测试步骤? 不是已知a=00011011111000001


(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

  • 打赏
  • 举报
回复
如果查询到的结果不是,第二条记录,
就说明,库中有比第二条记录更接近于条件的
查询结果,目测过去,就和条件数据差不多,几乎一样,这就对了
  • 打赏
  • 举报
回复
很不好意思,
其实测试很简单,就是取数据库中的某一个数据,当作查询条件
前面所说的
已知a=00011011111000001
只不过打个比方,主要是为了描述算法时简单直观点,
实际的数据是28个字节的二进制数据,
使用这样的数据来描述算法,
很难想象,会有几个人看的懂,
而且和难以直观的表现出来
比如,可以去数据库中的第二条记录
020002000200020002000200020002000200020002000200FFF80000
当作条件,查询出来的结果应该是第二条
因为记录是不重复的
接下来可以修改一点条件数据中的某一个字节,如:
020002000200020001000200020002000200020002000200FFE80000
继续验证查询,查询的结果应该也是第二条,
或者,第二条记录应该在记录集的前排位置
  • 打赏
  • 举报
回复
在这里做了个实验

mysql> select hex(zk^0x203833C048404440FBF8104010E0FCE09550595052483C40C0400000)
from hanzhiku where zk=0x203833C048404440FBF8104010E0FCE09550595052483C40C04000
00;
+--------------------------------------------------------------------+
| hex(zk^0x203833C048404440FBF8104010E0FCE09550595052483C40C0400000) |
+--------------------------------------------------------------------+
| 52483C40C0400053 |
+--------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

mysql>

这里计算机的计算就是错误的,数据的长度太长,超出了计算范围了
  • 打赏
  • 举报
回复
mysql> select id,hex(zk) from hanzhiku order by length(replace(BIN(zk^'0x7FF0020002003FF002000200FFF8040004000840082011F03E100000'),'0','')) desc limit 1;
+-------+----------------------------------------------------------+
| id | hex(zk) |
+-------+----------------------------------------------------------+
| 17648 | 203833C048404440FBF8104010E0FCE09550595052483C40C0400000 |
+-------+----------------------------------------------------------+
1 row in set, 44606 warnings (0.30 sec)

在这里先感谢一下!
理解版主的意思,可是,计算结果不是想象的那样
mysql> select max(id) from hanzhiku;
+---------+
| max(id) |
+---------+
| 22303 |
+---------+
1 row in set (0.00 sec)
我直接取第8条记录的值,进行查询,可是,就是不把第8条排第一
  • 打赏
  • 举报
回复
/*
Navicat MySQL Data Transfer

Source Server : 11
Source Server Version : 50513
Source Host : 192.168.2.88:3306
Source Database : asktao

Target Server Type : MYSQL
Target Server Version : 50513
File Encoding : 65001

Date: 2011-07-07 08:51:58
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `hanzhiku`
-- ----------------------------
DROP TABLE IF EXISTS `hanzhiku`;
CREATE TABLE `hanzhiku` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`zk` binary(28) NOT NULL,
PRIMARY KEY (`id`,`zk`)
) ENGINE=InnoDB AUTO_INCREMENT=22304 DEFAULT CHARSET=gbk;

-- ----------------------------
-- Records of hanzhiku
-- ----------------------------
INSERT INTO `hanzhiku` VALUES ('1', 0xFFF808000800080010001FE000200020002000200040064001800000);
INSERT INTO `hanzhiku` VALUES ('2', 0x020002000200020002000200020002000200020002000200FFF80000);
INSERT INTO `hanzhiku` VALUES ('3', 0xFFF80200020002000200020002000200020002000200020002000000);
INSERT INTO `hanzhiku` VALUES ('4', 0x0010FFF80400040004000800080010002000C0000000000000000000);
INSERT INTO `hanzhiku` VALUES ('5', 0xFFF802000200220023F0221042107FF0001000100020022001C00000);
INSERT INTO `hanzhiku` VALUES ('6', 0x7FF00210021012100C100610051008101010212040C00000FFF80000);
INSERT INTO `hanzhiku` VALUES ('7', 0x02002220222022202220FFF82220222022202220222022203FE00000);
INSERT INTO `hanzhiku` VALUES ('8', 0x7FF0020002003FF002000200FFF8040004000840082011F03E100000);
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
……
[/Quote]
不好意思,可能表达不清楚
首先库结构是:
只有2个字段,
一个字段名称为:`id` int(10) unsigned NOT NULL AUTO_INCREMENT
还有一个字段是二进制类型:`sj` binary(20) NOT NULL,
接下来是版本,用的是,最新版的MYSQL
比例数据库中有如下数据:
('1','01111010101000000');
('2','00001011111000101');

题目出来了
已知a=00011011111000001
求一个SQl语句,查询库中和a最接近的数据
算法如下:
先把a和字段'sj'异或运算
如下:
第一个记录:
01111010101000000
00011011111000001
结果1
01100001010000001
第二个记录:
00001011111000101
00011011111000001
结果2
00010000000000100
找出结果中.位为1最少的情况
这里的答案就是结果2,
然后返回,这个记录的ID
ACMAIN_CHM 2011-07-08
  • 打赏
  • 举报
回复
mysql> select id,hex(zk) from hanzhiku;
+----+----------------------------------------------------------+
| id | hex(zk) |
+----+----------------------------------------------------------+
| 1 | FFF808000800080010001FE000200020002000200040064001800000 |
| 2 | 020002000200020002000200020002000200020002000200FFF80000 |
| 3 | FFF80200020002000200020002000200020002000200020002000000 |
| 4 | 0010FFF80400040004000800080010002000C0000000000000000000 |
| 5 | FFF802000200220023F0221042107FF0001000100020022001C00000 |
| 6 | 7FF00210021012100C100610051008101010212040C00000FFF80000 |
| 7 | 02002220222022202220FFF82220222022202220222022203FE00000 |
| 8 | 7FF0020002003FF002000200FFF8040004000840082011F03E100000 |
+----+----------------------------------------------------------+
8 rows in set (0.03 sec)

mysql> select id,hex(zk) from hanzhiku
-> order by length(replace( BIN( zk^b'00011011111000001'),'1','')) desc limit 1;
+----+----------------------------------------------------------+
| id | hex(zk) |
+----+----------------------------------------------------------+
| 1 | FFF808000800080010001FE000200020002000200040064001800000 |
+----+----------------------------------------------------------+
1 row in set, 8 warnings (0.01 sec)

mysql>
  • 打赏
  • 举报
回复
关注,高手来啊.....
ACMAIN_CHM 2011-07-07
  • 打赏
  • 举报
回复
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rucypli 的回复:]
转化成整数

select max(id) from tb where id<整数
union all
select min(id) from tb where id>整数
[/Quote]
我要查询的是二进制的数据,不是ID
ID是键值,自动增加的
zhangpingh 2011-07-07
  • 打赏
  • 举报
回复
路过的 学习学习
rucypli 2011-07-07
  • 打赏
  • 举报
回复
转化成整数

select max(id) from tb where id<整数
union all
select min(id) from tb where id>整数


56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧