SQLite3:非ascii unicode chars'更新不起作用?

时间:2014-05-23 14:39:13

标签: c sqlite

我在win32下使用SQLite3,在我的C程序上使用SQLite3更新WVARCHAR列时,我总是将非ascii字符转换为悬空字符,这是我的代码的示例,遗憾的是不会更新正确的非ascii字符如'é':

    #include <stdio.h>
    #include <sqlite3.h>

    int main(){
      sqlite3_stmt *stmt;
      sqlite3 *sqdb;

      sqlite3_initialize();
      sqlite3_open("sqlite_unicode_test", &sqdb);
       const char* table_check = {
      "CREATE TABLE IF NOT EXISTS mytable("
       "id INTEGER PRIMARY KEY AUTOINCREMENT,"
       "mycolumn1 WVARCHAR,"
       "mycolumn2 WVARCHAR"
       ");"
       };
      sqlite3_prepare_v2(sqdb, table_check, -1, &stmt, 0);
      sqlite3_step(stmt);
      sqlite3_finalize(stmt);
      sqlite3_prepare16(sqdb, L"UPDATE mytable SET mycolumn1=? mycolumn2=? WHERE(id=0)", -1, &stmt, 0);
      sqlite3_bind_text16(stmt, 1, L"e", -1, SQLITE_STATIC); //e is stored correctly on the database
      sqlite3_bind_text16(stmt, 2, L"é", -1, SQLITE_STATIC); //however é not stored correctly: modified by a dangled character
      sqlite3_step(stmt);
      sqlite3_finalize(stmt);
      sqlite3_close(sqdb);
    }

我不知道为什么会发生这种情况,我之前发布了一个问题  (SQLite3: non-ascii characters not updated correctly?)但我不认为这与sqlite3 win32二进制文件有关,因为我测试过  使用gcc自己构建SQLite,总会出现同样的问题。 那么SQLite unicode有什么问题?我怎样才能完全解决问题?我需要帮助。

1 个答案:

答案 0 :(得分:1)

我认为你必须做两件事:

创建数据库时,必须指定utf-16(我认为UTF-8是默认值)。

此外,在绑定角色之前,必须将重音字符转换为UTF-16,而不是传递UNICODE字符串。

有关详细信息,请参阅this questionthis question