【问题标题】:Case insensitive search in Qt with SQLite使用 SQLite 在 Qt 中进行不区分大小写的搜索
【发布时间】:2011-02-05 17:11:17
【问题描述】:

我有一个 SQLite 数据库,其中包含西里尔字母行。 例如:

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

假设其中两行是这样的:

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

其实是俄文和英文写的同名姓。

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

因为我使用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 查询实现有某种关系吗?

【问题讨论】:

    标签: sqlite qt unicode case-insensitive


    【解决方案1】:

    默认情况下,SQLite 仅支持 ASCII 字符不区分大小写。如果你想支持 Unicode 大小写,你必须 define your own UPPER/LOWER functionscollation

    【讨论】:

    • 我已经为 SQLite 启用了 ICU 扩展,它支持不区分大小写。我已经运行了一些测试(其中一个列在问题的末尾),证明不区分大小写在 sqlite3 中有效,但在 Qt 中无效。我认为问题埋藏在驱动程序的 Qt 实现中。但我不知道具体在哪里。
    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 2012-12-20
    • 2010-09-12
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2011-10-17
    相关资源
    最近更新 更多