Как стать автором
Обновить

Комментарии 22

Можно обойтись без самосборки. 15 марта этого года в unstable появилсь сборка sqlite3, решающая данную проблему.

$ echo $LANG
ru_RU.UTF-8
$ sudo apt-get -qq -t unstable install sqlite3
$ sqlite3
sqlite> SELECT "ы" LIKE "Ы";
1

Хорошая новость. Но в macports как всегда через год появится, если вообще появится…
ну так соберите и сами и отправьте мэинтейнерам MacPorts
Собрать пакет — знаний не хватает. Но я конечно попытаюсь:) А фич реквест — да, в любом случае напишу.
Хочу такое счастье на ipad. Не думаю что Apple одобрит sqlite3_enable_load_extension(), да и свежего, а значит, сырого кода sqlite тоже долго ждать прийдется.

Спасибо автору за пост, без статьи про грабли я бы не узнал что такие грабли есть.
А для windows есть решение?
К сожалению windows'а у меня нет… Но думаю, точно так же можно собрать с помощью MSVC. В крайнем случае попробовать cygwin.
ICU для windows есть: icu-project.org/download/4.0.html#ICU4C
При компилляции SQLite с поддержкой ICU нужно указать дефайн SQLITE_ENABLE_ICU(-DSQLITE_ENABLE_ICU для gcc, для MSVC не знаю). Ну и соответствено путь к хидерам и к самой либе ICU.
Попробуйте. Отпишитесь если удастся:)
Я прошу прощения, но

Давайте разберемЬся как же это исправить.

?
Упс, спасибо, исправлено:)
Я решал эту проблему другим образом.
Переопределил функцию LIKE и стал отрабатывать ее сам.

Кроме того я таким методом сразу устранил проблему иньекций и прочего.
Тоже вариант, тогда и REGEXP тоже до кучи, мне ее в SQLite всегда не хватает.
И, как понимаю, вы от зависимости от ICU избавились?
Можно подробнее, как это сделать?
В исходниках функция likeFunc овечает за обработку LIKE, просто ее переписать и собрать измененный исходник.
Это, наверное, должно дико тормозить?
Достаточно пропатчить массив sqlite3UpperToLower (надо бы его расширить) + исправить где-надо range, если мне память не изменяет.
Все конечно замечательно, но как быть если регистронезависимый поиск сделать надо, но перекомпилять невозможно (шаред хостинг к примеру).
так как гугл по запросу «sqlite icu lower» выдает ссылку на эту страницу одной из первых, небольшой апдейт :)
1) sqlite3 на текущий момент собирается без icu (как написано в ченджлоге, это создало проблем больше, чем решило)
2) для AMD64 при сборке icu надо указывать параметр -fPIC
3) чтобы собранный с icu sqlite3 правильно установить в Ubuntu, надо configure вызывать с параметром prefix, иначе либа установиться в папку /usr/local/, и системно будет использоваться версия, установленная apt-get
$ CFLAGS='-Os -DSQLITE_ENABLE_ICU' CPPFLAGS=`icu-config --cppflags` LDFLAGS=`icu-config --ldflags` ./configure --prefix=/usr/

3) как правило во всех линуксах:
в /usr — только то, что в пакетах (deb, rpm, ...)
а собранное самостоятельно — в /usr/local
дополнения для debian:

1. wget в stable записывает имя файла как getfile\?f\=sqlite%2Fext%2Ficu%2Ficu.c => лучше поправить:
$ wget www.sqlite.org/cvstrac/getfile?f=sqlite/ext/icu/icu.c -O icu.c

2. для сборки необходим пакет libsqlite3-dev:
$ sudo apt-get install libsqlite3-dev
Ленивый вариант для русского LIKE в sqlite-amalgamation-3_7_2 (работает без icu):
-# define GlogUpperToLower(A) if( A<0x80 ) { A = sqlite3UpperToLower[A]; }
+# define GlogUpperToLower(A) if( A<0x80 ) { A = sqlite3UpperToLower[A]; } if ( A >= 0x0410 && A <= 0x042f) { A += 0x20; }
Ну может когда нибудь в официальную сборку введут, и не надо будет мучиться. sqlite сразу в разы станет популярнее.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории