由sqlite3_column_text返回的SQLite奇异值

SQLite strange value returned by sqlite3_column_text

本文关键字:SQLite 返回 sqlite3 column text      更新时间:2023-10-16

我有一个安装了sqlite的c++项目。

当应用程序启动时,它将使用以下代码创建数据库:
    // Open connection with database
if (SQLITE_OK != sqlite3_open_v2("Test.db", &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, nullptr)) {
    return false;
}
// Delete old tables if exists
char * error;
if (SQLITE_OK != sqlite3_exec(db, "DROP TABLE IF EXISTS Tests;", nullptr, nullptr, &error)) {
    return false;
}
// Recreate all tables
if (SQLITE_OK != sqlite3_exec(db, "CREATE TABLE Tests(testID INTEGER PRIMARY KEY ASC, name TEXT NOT NULL);", nullptr, nullptr, &error)) {
    return false;
}
// Test only
if (SQLITE_OK != sqlite3_exec(db, "INSERT INTO Tests(testID, name VALUES (1, 'Andrea');", nullptr, nullptr, &error)) {
    return false;
}

当我执行这段代码时:

sqlite3_stmt *query = nullptr;
if (SQLITE_OK != sqlite3_prepare_v2(db, "SELECT testID, name FROM Tests;", -1, &query, nullptr)) {
}
unsigned char const * t = nullptr;
if (SQLITE_ROW == sqlite3_step(query)) {
    t = sqlite3_column_text(query, 1);
    sqlite3_finalize(query);
}
printf( (char*)t );

我期待"Andrea",但这段代码打印:——PYoea——ð¶oea——ð§oea

每次结果不同

根据sqlite3_column_text文档,指针tsqlite3_finalize之后失效:

换句话说,您应该首先调用sqlite3_column_text()、sqlite3_column_blob()或sqlite3_column_text16()来强制结果为所需的格式,然后调用sqlite3_column_bytes()或sqlite3_column_bytes16()来查找结果的大小。

返回的指针在发生如上所述的类型转换之前,或者在调用sqlite3_step()或sqlite3_reset()或sqlite3_finalize()之前都是有效的。

根据@tkausl的建议,要解决这个问题,您应该打印数据或将其复制到sqlite3_finalize调用之前的某个地方以供进一步使用。