【问题标题】:SQLite3: non-ascii unicode chars' update not working?SQLite3:非 ascii unicode 字符的更新不起作用?
【发布时间】:2014-05-23 23:09:51
【问题描述】:

我在 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 将其简化为一个简单的案例
  • 你能出示你的连接声明吗...
  • @ojblas '你能展示你的连接声明'是什么意思?你是说shell的截图吗?
  • 显然在你准备一个语句之前你必须打开一个带有一些选项的数据库连接......
  • @ojblass 我更新了上面的代码。

标签: c sqlite


【解决方案1】:

我认为你必须做两件事:

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

此外,在绑定字符之前,您必须将重音字符转换为 UTF-16,并且不传递 UNICODE 字符串。

请参阅this questionthis question 了解更多信息。

【讨论】:

  • 非常感谢,这确实帮助我解决了问题!再次感谢。
猜你喜欢
  • 2011-09-24
  • 2012-05-21
  • 2015-04-10
  • 2015-07-01
  • 1970-01-01
  • 2015-09-14
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多