Поиск без учета регистра в Qt с SQLite - PullRequest
1 голос
/ 05 февраля 2011

У меня есть база данных SQLite с кириллическими строками.Например:

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

Предположим, что две строки выглядят следующим образом:

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

На самом деле это одно и то же имя и фамилия, написанные на русском и английском языках.

Я использую C ++ и Qt в моей программе.Я хочу выбрать строки, содержащие определенную строку в столбцах имени или фамилии.

Поскольку я использую QSqlTableModel, я просто использую фильтр (который является просто WHERE частью запроса SQL) с запросом 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);
}

Когда я устанавливаю фильтр на «ivan», он показывает правильную строку (с идентификатором 243).Однако, когда я пытаюсь сделать то же самое с 'иван', он не отображается, в то время как 'Иван', 'ван' и т. Д. Показывают правильные записи.Кажется, что запрос работает только с чувствительными к регистру совпадениями в кириллице, хотя он отлично работает с латинскими буквами.

Я знаю об ICU и уже включил его.И это работает:

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

Так что я до сих пор не могу понять, почему мои запросы в моей программе чувствительны к регистру, когда я использую буквы кириллицы?Это как-то связано с реализацией SQL-запроса в Qt?

1 Ответ

1 голос
/ 05 февраля 2011

По умолчанию SQLite поддерживает регистронезависимость только для символов ASCII.Если вам нужна поддержка Unicode, вам нужно определить свои собственные UPPER / LOWER функции и параметры сортировки .

...