先搞清楚幾件事情:
(1) SQLite只能按照幾種標准的字符編碼保存數據,及時你按照GB2312保存了漢字,SQLite還是按照數據庫的字符集解析字符編碼。這是問題的關鍵。數據庫的字符編碼:
PRAGMA encoding; (查看當前數據庫的字符編碼)
PRAGMA encoding = "UTF-8";
PRAGMA encoding = "UTF-16";
PRAGMA encoding = "UTF-16le";
PRAGMA encoding = "UTF-16be";
(2)如果SQLite將漢字按照GB2312編碼保存到數據庫中(通過UltraEdit二進制查看,如果能夠看到中文,說明是按照GB2312保存的),查詢肯定會出問題(不考慮BLOB字段)。使用sqlite3.exe執行插入操作,保存的漢字都是按照GB2312編碼保存的,因此使用like匹配時,肯定會出問題。
(3)我現在成功處理的方法:
1. 使用sqlite3_prepare執行的SQL語句,必須編碼成UTF8格式;Delphi: AnsiToUTF8轉換
2. 如果使用sqlite3_bind_text綁定文本,也必須編碼成UTF8格式
3. 字符讀出來后,也必須轉換成GB2312編碼,UTF8ToAnsi(Result)
這樣就不存在,查詢不出內容的問題。
存入數據時如果有中文就應該先轉成UTF8,取出來的時候要轉回來的ASCCI碼
public static object Execute()
{
byte[] bytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes("京"));
string str = Encoding.UTF8.GetString(bytes);
//Encoding coding = SQLiteConvert.Default;
SQLiteConnection conn = new SQLiteConnection("Data Source=Plate.db;Pooling=true;FailIfMissing=false");
SQLiteCommand cmd = new SQLiteCommand("select PlateNumber from PlateInfo where PlateNumber like '%" + str + "%'");
Encoding coding = SQLiteConvert.Default;
cmd.Connection = conn;
conn.Open();
object obj = cmd.ExecuteScalar();
conn.Close();
return obj;
}
