我在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有什么问题?我怎样才能完全解决问题?我需要帮助。
答案 0 :(得分:1)
我认为你必须做两件事:
创建数据库时,必须指定utf-16(我认为UTF-8是默认值)。
此外,在绑定角色之前,必须将重音字符转换为UTF-16,而不是传递UNICODE字符串。
有关详细信息,请参阅this question和this question。