Стояла задача обеспечить в sqlite регистронезависимый поиск по русскому тексту в UTF-8. Sqlite такого в стандартной поставке делать не умеет.
Выход найден.
Делаем следующее:
- Устанавливаем пакеты если их еще нет
- libsqlite3-dev
- sqlite3-0-dbg
- Скачиваем файл
wget www.sqlite.org/cvstrac/getfile?f=sqlite/ext/icu/icu.c -O icu.c
- Собираем
gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so
для AMD 64
gcc -shared icu.c `icu-config --ldflags` -fPIC -o libSqliteIcu.so
Не забываем о регистре в именах файлов для *nix систем
Копируем собранную библиотеку например к бинарику проекта, я скопировал в /usr/lib т.к. пользуюсь этой либой в command-line интерфейсе sqlite
- В pro файле добавляем
LIBS += -lsqlite3
- В проекте добавляем
#include <sqlite3ext.h> ... // после того как база данных открыта пишем QVariant v = db.driver()->handle(); if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*")==0) { // v.data() returns a pointer to the handle sqlite3 *handle = *static_cast
(v.data()); if (handle != 0) { // check that it is not NULL int res = sqlite3_enable_load_extension(handle,1); if (res == SQLITE_OK) { res = sqlite3_load_extension(handle,"libSqliteIcu.so",0,0); if (res == SQLITE_OK) qDebug() << "Sqlite3 load ICU extension sucessfully"; else qDebug() << "Sqlite3 load ICU extension fail"; } else qDebug() << "Sqlite3 enable load extension fail"; } }
И получаем проект в котором все запросы c LIKE, UPPER, LOWER отрабатываются с русским языком именно так как должно быть.
Комментариев нет:
Отправить комментарий