1


`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シェルがクラッシュします。.

4

1 に答える 1

1

substrblob 内の null バイトでも問題なく動作します。

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 値が正しいかどうかを確認します。
于 2013-03-12T13:39:47.560 に答える