我尝试在选择查询中获取 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);
}
[更新]
表结构:
cid name type
---------- ---------- ----------
0 NAME TEXT
1 BLOB_DATA BLOB
BLOB_DATA 是一个 blob 类型字段,它包含一个 20MB 的字符串,我只想显示字符串的前几个字节,但是 substr 函数不起作用,因为它会在 BLOB_DATA 的第一个 NULL 字节处停止,所以我必须编写上面的函数来解决问题。
该表包含大量数据,但 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位.