`subblobstr(BLOB_DATA,2,3)のように、select クエリで BLOB フィールドの一部を取得しようとしています。
コードは次のとおりで、正しくコンパイルできますが、機能しません。
誰かが私にアドバイスをくれることを願っています。ありがとうございます。
#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 は単一の 20MB 文字列を含む blob タイプのフィールドで、文字列の最初の数バイトを表示したいだけですが、substr 関数は BLOB_DATA の最初の NULL バイトで停止するため機能しません。問題を解決するには、上記の関数を作成する必要があります。
テーブルには多くのデータが含まれていますが、substr(BLOB_DATA,1,10) は多くても 1 桁しか返しません。
CL からの引用:
「テーブル内の値は文字列です。その場合、次のような方法でそれらを blob に変換する必要があります:」
UPDATE MyTable SET blob_data = CAST(blob_data AS BLOB)
上記のSQLステートメントを実行した後、sqliteシェルがクラッシュします。.