Как собрать 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?

Спасибо за понимание
  • Вопрос задан
  • 3581 просмотр
Решения вопроса 1
Для Windows можно собрать без ICU, при помощи Win API вызовов
SQLite и Unicode без ICU, Простой патч с использов...
В движке БД SQLite функции UPPER, LOWER, LIKE и GLOB по умолчанию работают только с латинским алфавитом. Для того, чтобы обеспечить нормальную их работу с юникодными символами, SQLite можно собрать с поддержкой библиотеки ICU (дефайн SQLITE_ENABLE_ICU). Однако, для систем где по умолчанию нет ICU это добавляет пару лишних десятков мегабайт, что может быть неприемлемо для компактных утилит и использовании в различных embedded-системах. Так, как в WinAPI (и других API/фрэймворках) есть свои функции для работы со строками, можно использовать их.

По ссылке можно скачать измененный исходник для версии 3.8.3 и собранную dll.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@zedxxx
В SQLite есть специальное API для регистрации своей функции сравнения строк: Define New Collating Sequences

When SQLite compares two strings, it uses a collating sequence or collating function (two words for the same thing) to determine which string is greater or if the two strings are equal. SQLite has three built-in collating functions: BINARY, NOCASE, and RTRIM.

BINARY - Compares string data using memcmp(), regardless of text encoding.
NOCASE - The same as binary, except the 26 upper case characters of ASCII are folded to their lower case equivalents before the comparison is performed. Note that only ASCII characters are case folded. SQLite does not attempt to do full UTF case folding due to the size of the tables required.
RTRIM - The same as binary, except that trailing space characters are ignored.

An application can register additional collating functions using the sqlite3_create_collation() interface.
Ответ написан
Комментировать
@kronic
Есть собранная под c# вместе с icu если интересует.
Если интересно могу собрать dll под windows вместе icu.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы