Russian Qt Forum

Qt => Базы данных => Тема начата: smartchecker от Декабрь 08, 2009, 17:59



Название: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: smartchecker от Декабрь 08, 2009, 17:59
Как сделать setFilter'у объяснить что хочу запрос типа select LIKE, а не select =


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: MoPDoBoPoT от Декабрь 08, 2009, 21:23
Непонятно, в чем собственно вопрос? Пишите в setFilter() условие LIKE, и все :)
Код
C++ (Qt)
model->setFilter("name LIKE 'Petrov %'");
 


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: smartchecker от Декабрь 09, 2009, 01:01
А как чтобы регистронезависимо?


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: Пантер от Декабрь 09, 2009, 07:15
Код
C++ (Qt)
model->setFilter("UPPER(name) LIKE UPPR('Petrov %'"))


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: smartchecker от Декабрь 09, 2009, 12:07
Код
C++ (Qt)
model->setFilter("UPPER(name) LIKE UPPR('Petrov %'"))
Не работает. SQLITE умеет такие конструкции?
Пытался скормить sqlbrowser'у из demos'ов - возвращает пустую таблицу.


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: Пантер от Декабрь 09, 2009, 12:46
Код
C++ (Qt)
model->setFilter("UPPER(name) LIKE UPPER('Petrov%'"))
Опечатался. Вот из документации SQLite:
Цитировать
upper(X)    Return a copy of input string X converted to all upper-case letters. The implementation of this function uses the C library routine toupper() which means it may not work correctly on non-ASCII UTF-8 strings.


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: smartchecker от Декабрь 09, 2009, 13:17
Код
C++ (Qt)
model->setFilter("UPPER(name) LIKE UPPER('Petrov%'"))
Опечатался. Вот из документации SQLite:
Цитировать
upper(X)    Return a copy of input string X converted to all upper-case letters. The implementation of this function uses the C library routine toupper() which means it may not work correctly on non-ASCII UTF-8 strings.
Насчёт опечатки я понял. И мануал прочитал.
В таблице строки в utf-8
в sqlbrowser'е пишу
Код
SQL
SELECT * FROM qweqwe WHERE upper(field1) LIKE upper('%фыв%')
результат - пустая таблица


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: MoPDoBoPoT от Декабрь 09, 2009, 15:35
1. Запрос действительно возвращает путстую таблицу.
2. Дело в различных кодировках программы и СУБД.


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: smartchecker от Декабрь 09, 2009, 16:27
1. Запрос действительно возвращает путстую таблицу.
2. Дело в различных кодировках программы и СУБД.
Тогда почему, если upper() не использовать, и передавать строку с учётом регистра, всё работает как надо?


Название: Re: QSQLITE, QSqlTableModel, setFilter(). select bla-bla LIKE
Отправлено: MoPDoBoPoT от Декабрь 09, 2009, 17:13
Я имелл ввиду ИЛИ (или 1 пункт, или 2). Проверил сам - запрос возвратит пустую строку, в случае отсутствия шаблона '%фыв%', т.е. регистр учитывается.
Почему? - потому что функция upper() не работате с русскоязычными символами (можешь сам убедится). Это, наверное, связано с "...not work correctly on non-ASCII UTF-8 strings."