2012-12-11 151 views
2

用C/C++接口插入二進制數據轉換成SQLite數據庫的SQLite不存儲BLOB:含有 0字節

// 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字節的團塊含有「他」的2字節的團塊,它被要求存儲。爲什麼?

它似乎在第一個0字節處結束,但blob不是字符串(因此需要sqlite3_bind_blob的大小參數),爲什麼它會將任意二進制數據視爲c樣式字符串?

+1

適用於我^ {tm}。你確定這不僅僅是打印程序不顯示完整的blob嗎?嘗試'sqlite3 example.db「從命令行上的tt;」'選擇長度(b)。 – user786653

+0

不要忘記接受答案,即使你必須接受你自己的答案。 –

+0

是,例如printf()停在\ 0處。 –

回答

2

你如何從數據庫中獲取BLOB?在那個時候它可能會被截斷;也許你的代碼在提取後將它當作字符串處理。

您可以通過BLOB API檢查實際的BLOB大小。 sqlite3_blob_open(),然後調用sqlite3_blob_bytes()。

+0

sqlitebrowser正在從數據庫中獲取blob – OJW

2

sqlite3 存儲全部數據,但sqlitebrowser被視爲文本列而不是blob列。

從C++界面讀取數據而不是在sqlitebrowser中查看數據會得出正確的結果。