2

C/C++ インターフェイスを使用して sqlite データベースにバイナリ データを挿入する:

  // Previously: "create table tt(i integer primary key, b blob)"
  sqlite3 *sqliteDB;
  if(sqlite3_open("example.db", &sqliteDB) == 0)
    {

    // "insert" statement
    const char *sqlText = "insert into tt (i,b) values (?,?)";
    sqlite3_stmt *preparedStatement;
    sqlite3_prepare_v2(sqliteDB, sqlText, (int)strlen(sqlText), &preparedStatement, 0);

    // add the number
    sqlite3_bind_int(preparedStatement, 1, 1);

    // add the data
    char myBlobData[] = "He\0llo world"; // sizeof(myBlobData) is 13 bytes
    sqlite3_bind_blob(preparedStatement, 2, myBlobData, sizeof(myBlobData), 0); // returns SQLITE_OK

    // store in database
    sqlite3_step(preparedStatement); // returns SQLITE_DONE

    sqlite3_close(sqliteDB);
    }

これは、保存するように要求された 13 バイトの BLOB ではなく、"He" を含む 2 バイトの BLOB を保存します。なんで?

最初の 0 バイトで終わっているように見えますが、ブロブは文字列ではありません (したがって、sqlite3_bind_blob へのサイズ パラメータが必要です)。なぜ任意のバイナリ データを C スタイルの文字列として扱うのでしょうか?

4

1 に答える 1

2

DB から BLOB をどのように取得していますか? その時点で切り捨てられている可能性があります。おそらく、コードは抽出後に文字列として扱っています。

BLOB API を使用して、実際の BLOB サイズを確認できます。sqlite3_blob_open() の後に sqlite3_blob_bytes() を呼び出します。

于 2012-12-11T17:39:26.510 に答える