1

我尝试在选择查询中获取 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位.

4

1 回答 1

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)
    
  • 或者您正在尝试显示返回的值,这可能会将其转换为字符串。使用quoteor之类的函数length来检查返回的 blob 值是否正确。
于 2013-03-12T13:39:47.560 回答