我尝试在选择查询中获取BLOB字段的一部分,例如,
`subblobstr(BLOB_DATA,2,3)
代码如下,它可以正确编译,但不起作用:subblobstr(BLOB_DATA,2,3)仍然得到与substr(BLOB_DATA,2,3)相同的结果。
希望有人能给我一些建议。谢谢你提前。
#include <stdio.h>
#include <string.h>
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
void subblobstr(sqlite3_context* ctx, int argc, sqlite3_value* argv[])
{
const char* blobdata;
int blob_len, start, slen;
blobdata = (char*)sqlite3_value_blob(argv[0]);
blob_len = sqlite3_value_bytes(argv[0]);
start = sqlite3_value_int(argv[1]) - 1;
slen = sqlite3_value_int(argv[2]);
sqlite3_result_blob(ctx, blobdata + start, slen, SQLITE_TRANSIENT);
}
int sqlite3SubBlobStrInit(sqlite3 *db){
sqlite3_create_function(db, "subblobstr",3,SQLITE_ANY, 0, subblobstr, 0, 0);
return 0;
}
int sqlite3_extension_init(
sqlite3 *db,
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
SQLITE_EXTENSION_INIT2(pApi)
return sqlite3SubBlobStrInit(db);
}
[UPDATE]
表结构:
cid name type
---------- ---------- ----------
0 NAME TEXT
1 BLOB_DATA BLOB
BLOB_DATA是一个blob类型的字段,它包含一个20MB的字符串,我只想显示字符串的前几个字节,但是,substr函数不起作用,因为它将停止在第一个NULL字节中BLOB_DATA,所以我必须编写上面的函数来解决问题。
该表包含大量数据,但substr(BLOB_DATA,1,10)最多返回一位数。
来自CL的报价:
“表中的值是字符串,在这种情况下,您应该将它们转换为blob,如下所示:”
UPDATE MyTable SET blob_data = CAST(blob_data AS BLOB)
运行上面的SQL语句后,sqlite shell将崩溃。(SQLite版本3.7.15.2 Win7)
,所以我使用SQLite Databasebut Browser首先设置BLOB_DATA的类型(BLOB),然后substr(BLOB_DATA,1,10)仍然返回1位数。
答案 0 :(得分:1)
substr
在blob中使用空字节可以正常工作:
sqlite> CREATE TABLE MyTable(MyBlob);
sqlite> INSERT INTO MyTable VALUES (x'aabbccddeeff');
sqlite> INSERT INTO MyTable VALUES (x'221100221100');
sqlite> INSERT INTO MyTable VALUES (x'123456');
sqlite> INSERT INTO MyTable VALUES (x'ff1100223456');
sqlite> SELECT quote(MyBlob) FROM MyTable WHERE substr(MyBlob, 2, 3) = x'110022';
X'221100221100'
X'FF1100223456'
你的问题是
表中的值是字符串,在这种情况下,您应该将它们转换为blob,如下所示:
UPDATE MyTable SET blob_data = CAST(blob_data AS BLOB)
quote
或length
等函数检查返回的blob值是否正确。