【发布时间】: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 我更新了上面的代码。