使用SQLite在Qt中进行不区分大小写的搜索

时间:2011-02-05 17:11:18

标签: sqlite qt unicode case-insensitive

我有一个带有西里尔行的SQLite数据库。 例如:

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

假设其中两行是这样的:

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

它实际上是用俄语和英语写的同名和姓氏。

我在程序中使用c ++和Qt。我想在名称或姓氏列中选择包含特定字符串的行。

由于我使用QSqlTableModel,我只使用SQL查询过滤器(只是SQL查询的WHERE部分):

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);
}

当我将过滤器设置为'ivan'时,它显示正确的行(ID为243)。但是,当我试图用'иван'做同样的事情时它没有显示,而'Иван','ван'等显示正确的条目。看起来这个查询只适用于西里尔字母区分大小写的匹配,而拉丁字母则完全正常。

我知道ICU已启用它。它有效:

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

因此,当我使用西里尔字母时,我仍然无法理解为什么我的程序中的查询区分大小写?它是否与Qt中的SQL查询实现有某种关系?

1 个答案:

答案 0 :(得分:1)

默认情况下,SQLite仅支持ASCII字符的大小写不敏感。如果您需要支持Unicode大小写,则必须define your own UPPER/LOWER functionscollation