如何从Mysql select ID查询中获取位集blob?
如果能做到以下几点,那就太好了: 假设我有一个“document”mysql表,其中包含一个文档“id”和一些其他列:如何从Mysql select ID查询中获取位集blob?,mysql,blob,bitset,Mysql,Blob,Bitset,如果能做到以下几点,那就太好了: 假设我有一个“document”mysql表,其中包含一个文档“id”和一些其他列: CREATE TABLE document(id INT AUTO_INCREMENT NOT NULL, ....); 可能有很多文档,但现在我只有200万 我希望在我的编程语言空间中快速获得此查询的结果: SELECT id FROM document WHERE ... whatever ...; 子句“whatever”可能为空,因此集合可以包含所有文档的id 所以
CREATE TABLE document(id INT AUTO_INCREMENT NOT NULL, ....);
可能有很多文档,但现在我只有200万
我希望在我的编程语言空间中快速获得此查询的结果:
SELECT id FROM document WHERE ... whatever ...;
子句“whatever”可能为空,因此集合可以包含所有文档的id
所以我的问题是:有没有一种方法可以将这个查询的结果作为大小为200万位(约250k的数据)的位向量BLOB,而不是潜在的200万个字符串化数字(约14Mo..不太好)
稀疏集情况下的blob压缩额外荣誉:)虽然性能将非常糟糕,但此存储过程将为您提供所需的结果:
CREATE PROCEDURE ex12688666(whatever TEXT)
DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
COMMENT ''
proc: BEGIN
DECLARE not_found BOOL DEFAULT FALSE;
DECLARE max BIGINT UNSIGNED DEFAULT 0;
DECLARE len BIGINT UNSIGNED;
DECLARE i BIGINT UNSIGNED;
DECLARE pos BIGINT UNSIGNED;
DECLARE result LONGBLOB DEFAULT '';
DECLARE cur1 CURSOR FOR
SELECT id FROM ids WHERE id RLIKE whatever ORDER BY id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = TRUE;
SELECT MAX(id) INTO max FROM ids;
IF (max > 0) THEN
SET len = FLOOR((max + 7) / 8);
SET result = REPEAT("\0", len);
OPEN cur1;
loop1: LOOP
FETCH cur1 INTO i;
IF not_found THEN
LEAVE loop1;
END IF;
SET pos = FLOOR(i / 8) + 1;
SET result = CONCAT(
SUBSTRING(result, 1, pos - 1),
CHAR(ASCII(SUBSTRING(result, pos, 1)) | (1 << (i MOD 8))),
SUBSTRING(result, pos + 1)
);
END LOOP;
CLOSE cur1;
END IF;
SELECT HEX(result) AS result;
END;
简单地
SELECT result;
或者,如果要对结果进行zlib压缩:
SELECT COMPRESS(result) AS result;
这应该得到你提到的额外荣誉
有关交互式演示,请参见。Hmm。。。这真的属于数据库层吗?我能想到的在MySQL中实现这一点的唯一方法是,在组聚合期间,编写一个初始化然后更新
BLOB
值的函数;如果不局限于64位精度的话,我想如果本机无法做到这一点,一个带有签名BLOB f(id\u query,id\u name,max\u id)的新函数可以完成这项工作。我想我得从我的C编译器中吹掉灰尘:)
SELECT COMPRESS(result) AS result;