2011-02-05 17 views
1

我有一個SQLite數據庫與它的西里爾行。 例如:在Qt中區分大小寫的搜索與SQLite

CREATE TABLE customer (
    id INTEGER PRIMARY KEY, 
    name TEXT, 
    surname TEXT 
); 

假設兩排中是這樣的:

"153 | Иван | Попов" 
"243 | Ivan | Popov" 

它實際上是相同的名字和姓氏寫在俄語和英語。

我在程序中使用C++和Qt。我想選擇名稱或姓氏列中包含特定字符串的行。

由於我使用QSqlTableModel我簡單地使用過濾器(這是SQL查詢的只是WHERE一部分)與SQL查詢:

void filterTable(QString filter) 
{ 
    QString query; 
    if(!filter.isEmpty()) 
    { 
     //I've added the wildcards to be able to search 
     //using only subset of the name or surname 
     query += "name LIKE '%" + filter "%' OR "; 
     query += "surname LIKE '%" + filter "%'"; 
    } 
    mySqlTableModel->setFilter(query); 
} 

當我設置過濾器「伊萬」它顯示了正確的行(ID爲243)。但是,當我嘗試對「иван」執行相同操作時,它不顯示,而'Иван','ван'等顯示正確的條目。似乎查詢只適用於西里爾文中區分大小寫的匹配項,而使用拉丁字母則完全正常。

我知道ICU並已啓用它。它的工作原理:

$ sqlite3 
$ SELECT 'Иван' like 'иван'; 
1 

所以我仍然無法理解爲什麼當我用西裏爾字母我在我的程序查詢是區分大小寫?它在某種程度上與Qt中的SQL查詢實現有關嗎?

回答

1

默認情況下,SQLite僅支持ASCII字符的不區分大小寫。如果你想要支持Unicode套裝,你必須要define your own UPPER/LOWER functionscollation

+1

我已經爲SQLite啓用ICU擴展,支持不區分大小寫。我已經運行了一些測試(其中一個在問題的最後列出),證明不區分大小寫在sqlite3中工作,但它不在Qt中。我認爲這個問題隱藏在驅動程序的Qt實現中。但我不知道究竟在哪裏。 – ashagi 2011-02-06 10:22:16