Название: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Сентябрь 24, 2010, 14:31 День добрый!
Господа подскажите следующий вопрос. Есть: Linux (Kubuntu. Кодировка UTF-8) QT 4.6 База SQLITE Приложение работающее с этой базой Нужно: Заставить базу работать с регистронезависимым LIKE для русских букв. Всю голову сломал и почти весь гугле перелопатил, никак не найду ответа. Читал за ICU, скомпилил библиотеку через command line интерфейс с этой базой через ".load 'libSqliteIcu.so';" и "SELECT icu_load_collation('ru_RU', 'RUSSIAN')" все работает как нужно. Если это же пишу в приложении ничего не получаеться Код: QSqlQuery query(db); load extension res = false error = "near ".": syntax error Unable to execute statement" load collation res = false error = "no such function: icu_load_collation Unable to execute statement" Проскакивала информация что можно как-то через "QVariant QSqlDriver::handle () const [virtual]" В Assistant-е написано Код: QSqlDatabase db = ...; Цитировать Instead of providing full Unicode case support by default, SQLite provides the ability to link against external Unicode comparison and conversion routines. The application can overload the built-in NOCASE collating sequence (using sqlite3_create_collation()) and the built-in like(), upper(), and lower() functions (using sqlite3_create_function()). The SQLite source code includes an "ICU" extension that does these overloads. Or, developers can write their own overloads based on their own Unicode-aware comparison routines already contained within their project. Но, что-то не могу осилить... :-( Собственно сам вопрос. Как заставить SQLITE понимать регистронезависимый поиск в базе по русским словам? Название: Re: SQLITE регистронезависимый LIKE Отправлено: Termit от Сентябрь 24, 2010, 16:40 Собственно в FAQ (http://www.sqlite.org/faq.html#q18), который был процитирован, четко сказано, что данная ф-ция работает только для ASCII. Для прочих кодировок нужно писать свои функции like(), upper(), lower() и пр. Или как вариант собрать SQLITE с ICU. Та не вопрос, напишу свои функции для чего угодно :-) Это ясно... Вопрос как прикрутить эти самые функции? По примеру и Assistant получу я handler sqlite. И чего с ним делать? Как добавить туда эти самые функции? Название: Re: SQLITE регистронезависимый LIKE Отправлено: DmP от Сентябрь 24, 2010, 16:48 Собственно в FAQ (http://www.sqlite.org/faq.html#q18), который был процитирован, четко сказано, что данная ф-ция работает только для ASCII. Для прочих кодировок нужно писать свои функции like(), upper(), lower() и пр. Или как вариант собрать SQLITE с ICU. Та не вопрос, напишу свои функции для чего угодно :-) Это ясно... Вопрос как прикрутить эти самые функции? По примеру и Assistant получу я handler sqlite. И чего с ним делать? Как добавить туда эти самые функции? http://www.sqlite.org/c3ref/create_collation.html http://www.sqlite.org/c3ref/create_function.html Вот не заметил, что уже собрано с ICU. ".load" - это команда шела, а не SQL. Если посмотреть в исходники шела, то увидим обработку этой команды: Код: if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ Название: Re: SQLITE регистронезависимый LIKE Отправлено: DmP от Сентябрь 24, 2010, 17:05 Вот только вопрос как вызвать эту sqlite3_load_extension.
Как вариант можно пропатчит QSQLiteDriver, например, добавив в него функцию loadExtension() вызывающую sqlite3_load_extension(). Пересобрать плагин. Потом все просто: Цитировать QSQLiteDriver* driver = qobject_cast<QSQLiteDriver*>(mydb.driver()); driver->loadExtension("libSqliteIcu.so"); Название: Re: SQLITE регистронезависимый LIKE Отправлено: Termit от Сентябрь 25, 2010, 16:01 Решение найдено.
Итого: 1. Необходимо установить пакеты Код: - libsqlite3-dev 2. Скачиваем icu.c Код: wget www.sqlite.org/cvstrac/getfile?f=sqlite/ext/icu/icu.c -O icu.c 3. Собираем Код: gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so Код: gcc -shared icu.c `icu-config --ldflags` -fPIC -o libSqliteIcu.so 4. В pro файл проекта добавляем Код: ... 5. В проект добавляем Код: ... Получаем подключение к sqlite у которого LIKE работает регистронезависимо для русского текста в кодировке UTF-8 P.S. Функции upper, lower, работу с regexp-ами не проверял (сейчас не до того), но думаю, будет работать... Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: nata267 от Январь 13, 2011, 11:33 я под виндоус программирую подключила sqlite3.dll, но у меня программа вылетает на строчке
int res = sqlite3_enable_load_extension(handle,1); Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: DmP от Январь 13, 2011, 12:26 я под виндоус программирую подключила sqlite3.dll, но у меня программа вылетает на строчке Под виндой, плагин для sqlite по умолчанию собирается вместе с самой sqlite, поэтому нужно убедится в том, что Qt собрана с опцией -system-sqlite, иначе будет кощунство.int res = sqlite3_enable_load_extension(handle,1); Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: nata267 от Январь 13, 2011, 12:54 я под виндоус программирую подключила sqlite3.dll, но у меня программа вылетает на строчке Под виндой, плагин для sqlite по умолчанию собирается вместе с самой sqlite, поэтому нужно убедится в том, что Qt собрана с опцией -system-sqlite, иначе будет кощунство.int res = sqlite3_enable_load_extension(handle,1); да, это понятно что собирается с sqlite, но регистронезаисимый like для русских букв все равно не работает, говорян нужно подключать какое-то icu расширение Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Январь 13, 2011, 12:56 да, это понятно что собирается с sqlite, но регистронезаисимый like для русских букв все равно не работает, говорян нужно подключать какое-то icu расширение ICU = International Components for Unicode http://icu-project.org/download/4.0.html Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Январь 13, 2011, 13:19 Что касается самого подключения...
Как минимум libSqliteIcu.so в Windows должна выглядеть как libSqliteIcu.dll Типа такого Код: res = sqlite3_load_extension(handle,"libSqliteIcu.dll",0,0); А ее нужно либо найти, либо собрать самой... И имя у этой библиотеки может быть любое Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: nata267 от Январь 14, 2011, 12:36 :-[ не могу ни собрать ни найти эту библиотеку, скачала исходники, но там какая то хрень, скачала бинарники, то же самое
Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: nata267 от Январь 17, 2011, 16:38 не подскажете какие файлы нужны для компиляции этого расширения кроме icu.c
Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Январь 17, 2011, 16:57 не подскажете какие файлы нужны для компиляции этого расширения кроме icu.c Чем будете собирать? Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: nata267 от Январь 17, 2011, 17:01 я пытаюсь mingw, но я пытаюсь проект сделать в qt creator - вот pro файл:
Код: TARGET = libSqliteIcu у меня ошибки вылазят при компиляции: Creating library file: release\liblibSqliteIcu.a release/icu.o(.text+0x5c):icu.c: undefined reference to `_imp__utf8_countTrailBytes_44' release/icu.o(.text+0x8d):icu.c: undefined reference to `_imp__utf8_countTrailBytes_44' release/icu.o(.text+0x115):icu.c: undefined reference to `_imp__utf8_countTrailBytes_44' release/icu.o(.text+0x18a):icu.c: undefined reference to `u_foldCase_44' release/icu.o(.text+0x19a):icu.c: undefined reference to `u_foldCase_44' release/icu.o(.text+0x263):icu.c: undefined reference to `_imp__utf8_countTrailBytes_44' release/icu.o(.text+0x29e):icu.c: undefined reference to `_imp__utf8_countTrailBytes_44' release/icu.o(.text+0x4f2):icu.c: undefined reference to `utf8_nextCharSafeBody_44' release/icu.o(.text+0x52a):icu.c: undefined reference to `u_errorName_44' release/icu.o(.text+0x605):icu.c: undefined reference to `uregex_setText_44' release/icu.o(.text+0x641):icu.c: undefined reference to `uregex_matches_44' release/icu.o(.text+0x690):icu.c: undefined reference to `uregex_open_44' release/icu.o(.text+0x6c5):icu.c: undefined reference to `uregex_setText_44' release/icu.o(.text+0x7ef):icu.c: undefined reference to `u_strToUpper_44' release/icu.o(.text+0x84d):icu.c: undefined reference to `u_strToLower_44' release/icu.o(.text+0x90b):icu.c: undefined reference to `ucol_strcoll_44' release/icu.o(.text+0x9db):icu.c: undefined reference to `ucol_open_44' release/icu.o(.text+0xa51):icu.c: undefined reference to `ucol_close_44' release/icu.o(.text+0x595):icu.c: undefined reference to `uregex_close_44' release/icu.o(.text+0x8c5):icu.c: undefined reference to `ucol_close_44' Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: nata267 от Январь 17, 2011, 17:03 я вообщето dll ки никогда не собирала, что называется изучаю с нуля
Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: virtual_root от Апрель 19, 2013, 09:26 Ребята, помогите пожалуйста! Я программирую под Linux(debian). Мне нужно организовать регистронезависимый LIKE в запросах.
Сделала как описано выше: Цитировать 1. Необходимо установить пакеты но 3 пункт не могу пройти...Код: - libsqlite3-dev 2. Скачиваем icu.c Код: wget www.sqlite.org/cvstrac/getfile?f=sqlite/ext/icu/icu.c -O icu.c для AMD 64 Код: gcc -shared icu.c `icu-config --ldflags` -fPIC -o libSqliteIcu.so icu.c:1:1: error: expected identifier or ‘(’ before ‘<’ token я выполняю 3 пункт из домашней директории, куда и скачала icu.c, но не знаю как преодолеть эту ошибку.. Меня удивило содержание файла uci.c: Код: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> Подскажите пожалуйста!!! Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Апрель 19, 2013, 10:17 Это скачалась html страничка. У файла, видимо, изменился адрес.
Прикрепляю к сообщению. Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: virtual_root от Апрель 19, 2013, 10:40 спасибо огромное!
Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: virtual_root от Апрель 19, 2013, 11:21 всё наконец собралось и я получила файл libSqliteIcu.so. Но теперь проблема в следующем:
пробую выше приведенный кусок кода: Код: /* Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Апрель 19, 2013, 12:03 Файл libSqliteIcu.so необходимо скопировать в какой-нить каталог в котором система ищет библиотеки. Я копирую в /usr/lib/
Код
либо в каталоге /etc/ld.so.conf.d/ создать файл с расширением conf и прописать в нем полный путь к библиотеке. После этого запустить Код
Если это не поможет покажите полный код, может в нем что-то не так. Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: virtual_root от Апрель 19, 2013, 12:45 Не помогло.. По этой ссылке http://helper.program21.ru/wp-content/uploads/2013/04/SQLite_with_module_icu.zip (http://helper.program21.ru/wp-content/uploads/2013/04/SQLite_with_module_icu.zip) можно скачать мой проект. Помогите пожалуйста! Подскажите что я сделала не так?
Может у меня что-то с sqlite3 не так? Название: Re: [SOLVED] SQLITE регистронезависимый LIKE Отправлено: Termit от Апрель 20, 2013, 11:43 Необходимо привести в такой вид загрузку самого расширения. Изменения выделил отступами.
Код
Помимо этого в SQL запросе не нужно напрямую писать текст кириллицей. Лучше биндить параметры через bindValue, а сам текст делать через tr(). Ну или на крайняк использовать Код
|