Как включить поддержку ICU в System.Data.SQLite ?
Это повтор моей темы из рассылки sqlite http://sqlite.1065341.n5.nabble.com/
Как включить поддержку ICU в System.Data.SQLite ?
Мне нужен регистро не зависимый поиск в fts таблицах.
Я делаю так:
0.Компилирую ICU из исходных кодов
1.Загружаю исходный код System.Data.SQLite
2.Добавляю в Preprocessor Definitions SQLITE_ENABLE_ICU=1
3.Добавляю в Include Diretories ссылку на заголовочные файлы ICU
4.Добавляю в Linker->General->Additional Library Derectories ссылку lib ICU
5.Добавляю в Linker->Input->Additional Dependencies ссылку
icudt.lib
icuin.lib
icuuc.lib
6.Отключаю в «extension-functions.c» ошибку переопределения типов
(просто комментирую
//typedef signed int int16_t;
//typedef unsigned int uint16_t; )
7.Строю
8.Создаю проект в MCVS, добавляю ссылку на System.Data.SQLite.dll
9.Копирую в папку проекта файлы (наример \bin\Debug)
icudt59.dll
icuin59.dll
icuuc59.dll
SQLite.Interop.dll
Проверяю CREATE VIRTUAL TABLE rusnames USING fts4(a, b, c, tokenize=icu ru_Ru) работает
Но может быть есть другой, более простой способ сделать это?
Я не смог найти никакой документации кроме
http://www.sqlite.org/cgi/src/. me=ext/icu
System.data.sqlite не существует!
Всем добра. Я в качестве базы данных выбрал sqlite. скачал с офф сайта sqlite studio и sqlite.
Почему нет SQLite в разделе System.DATA
Не могу понять как сделать. чтобы подключение к SQLite было в System.Data. Подскажите пожалуйста. А.
Установка System.Data.SQLite для Visual Studio 2015
Пытаюсь разобраться, как подключить SQLite к EF. Но первая же проблема — не могу скачать файл.
Не удалось найти запрошенного поставщика данных (System.Data.SQLite)
Добавил в код System.Data.SQLite.dll, подключил в начале кода, вместе с Common. Код простой.
Вы в разделе C#. Регистронезависимый поиск можно без пересборки задействовать. Скорость только надо замерить.
Добавлено через 1 минуту
А, это же вы спрашивали уже. Не получилось что-то?
How to compile sqlite with ICU?
How can I compile sqlite with icu ?
2 Answers 2
The easiest way to compile and use the ICU extension is to build and use it as a dynamically loadable SQLite extension. To do this using gcc on *nix:
You may need to add «-I» flags so that gcc can find sqlite3ext.h and sqlite3.h. The resulting shared lib, libSqliteIcu.so, may be loaded into sqlite in the same way as any other dynamically loadable extension.
(loading is .load libSqliteIcu.so in SQLite prompt)
2) You can compile SQLite with ICU enabled. According to http://www.sqlite.org/compile.html you should define macro SQLITE_ENABLE_ICU :
Add -DSQLITE_ENABLE_ICU to the CFLAGS variable or add #define SQLITE_ENABLE_ICU in some config file.
Okay, there is something here not described in standard documentation. Here is an example of calling configure with ICU enabled:
You also should have icu-config program installed (it is from libicu or libicu-dev package)
Whether you build the amalgamation with icu enabled or just icu extension depends on what you want to do with icu.
If you need an icu tokenizer (to do fts) you need to build amalgamation, if you just need the icu functions as https://www.sqlite.org/cgi/src/dir?ci=6cb537bdce85e088&name=ext/icu list then icu extension is enough.
When building icu extension I find I can not name it libSqliteIcu.so as that readme said b/c when I load it I got this error
After asking the question at sqlit mail list I was told that, which I have confirm.
Как собрать SQLite с ICU?
Есть такая замечательная СУБД, называется SQLite. В той версии скомпилированной dll, которую предлагают скачать с официального сайта имеются проблемы с case insensitive LIKE и ORDER BY для юникода:
Если запись в базе имеет значение поля содержит «ЦЦЦ», то при запросе с условием LIKE ‘%ццц%’ эта запись не будет выведена, что бы ты ни делал, какие бы lower() и upper() ни применял. То же самое с ORDER BY: при сортировке по столбцу с русским содержимым результат будет примерно таким:
ААА
БББ
ЯЯЯ
ввв
ггг
яяя
Проблема решается компиляцией библиотеки с опцией SQLITE_ENABLE_ICU. Эта опция подключает расширение Internetional Components for Unicode, библиотеку которого нужно взять с соответствующего сайта и тоже, в свою очередь, скомпилировать.
Моя проблема состоит в том, что я не дружу с MSVS и Linux’ом и сколько бы усилий я ни прикладывал, мне ни разу не удалось собрать эту треклятую SQLite с ICU.
Самое значительное, что мне удалось нагуглить — это двухлетней давности тема на sql.ru, где насмехаются над новичком в похожей ситуации и вопрос на stackoverflow с объяснением для Linux’а. Ни та, ни другая ссылка, увы, мне не помогла.
Кроме того, есть уже собранные dll здесь, но там SQLite 3.7.4, а хочется чего-нибудь посвежее.
Быть может, у кого есть в закромах SQLite 3.9+ с включенным ICU? Или кто-то может собрать ее и выложить? Или поделиться ссылкой на подробную инструкцию сборки для windows?
Регистронезависимый LIKE в SQLite для кириллицы
Dec 27, 2015 · 2 min read
При использовании LIKE или ORDER BY в SQLite с Unicode-символами может возникнуть проблема, связанная с неспособностью SQLite по умолчанию правильно воспринимать разные регистры одной и той же буквы:
Поиск приводит к расширению ICU, которое переопределяет функции изменения регистра так, чтобы символы за пределами таблицы ASCII правильно приводились к заданному регистру.
Есть два варианта использования расширения:
- Скомпилировать SQLite вместе с расширением (и использовать вместо системной библиотеки).
- Скомпилировать расширение как Runtime Loadable Extension.
Мне хотелось использовать расширение через стандартный модуль sqlite3 в Python, поэтому было решено пойти по второму пути.
Для начала установим необходимые пакеты с исходным кодом:
Скачаем исходный код самого расширения:
А дальше — немн о го странный момент. Если мы сейчас скомпилируем расширение, то вероятно, получим следующую ошибку при попытке загрузить его (имя в вашей версии SQLite может быть другим):
Чтобы исправить ошибку, редактируем файл icu.c, заменяя в нем имя функции sqlite3_icu_init на sqlite3_sqliteicu_init .
Теперь собираем расширение:
Загружаем расширение и проверяем, что все в порядке:
Бонус
Для того, чтобы загрузить это расширение из Python, сначала разрешаем загрузку расширений из библиотек и затем загружаем саму библиотеку:
sqlite3 и регистронезависимый поиск по русскому Unicode
xubuntu 12.04.03
sqlite 3.7.9 (ставился из офи.реп xubuntu)
БД sqlite в unicode, русские символы соотв.
делаю:
select
*
from node i
where
lower(i.title) LIKE
‘%киев%’
естественно, «Киев» не находится
Как быть и куда бежать?
Работать предполагается через консольный клиент (+ Sqliteman), есличто.
Пока не поздно откройте для себя тег [code].
надо собирать SQLite с поддержкой ICU
А не лучше отдельно либу собирать и подключать по необходимости?
Добавить ещё одно поле с тем же значением, но в нижнем регистре; обновлять его триггером. Искать по нему, переводя запрос в нижний регистр.
Пока не поздно откройте для себя тег [code].
я так понял, что он не работает при включенном построчном режиме комментирования?
надо собирать SQLite с поддержкой ICU
а можно какую-то инструкцию на тему?
Добавить ещё одно поле с тем же значением, но в нижнем регистре; обновлять его триггером. Искать по нему, переводя запрос в нижний регистр.
это хорошая мысль конечно, но БД распухнет в два раза минимум + увеличится время на insert-ы (что таки критично, ибо БД мучается очень часто на запись)
но БД распухнет в два раза минимум + увеличится время на insert-ы (что таки критично, ибо БД мучается очень часто на запись)
Значит sqlite — плохой выбор в данном случае.
это расширение есть сразу в sqlite3.c, но его надо собирать с -DSQLITE_ENABLE_ICU