Автоматическое подключение collation для русского языка в расширении ICU для SQLite
Для удобства работы с русским текстом в SQLite можно сделать автоматическое подключение нужного collation. Это позволит проводить сортировку и регистронезависимый поиск для русскоязычных текстов. В рассылке sqlite-users периодически пробегает вопрос, как же сделать такое для того или иного языка, а уж в рунете и вовсе этот вопрос "притча во языцех".
При этом сразу после открытия базы мы увидим следующее:
Таким образом, получаем встроенную поддержку руссого языка, достаточно лишь для поля таблицы указать "collate russian".
Для дебиана можно брать пакеты из моего репозитория. Для виндоус можно взять не сильно свежую версию SQLite с ICU
здесь (вот только не обещаю, что коллэйшен russian там автоматически грузится, поскольку сборку делал отнюдь не для русскоговорящих пользователей). Так что лучше взять последнюю версию SQLite с офсайта, пропатчить и скомпилировать с ICU, который я уже собрал и выложил тут.
Патч объявляет коллэйшен "ru_RU" как "russian" непосредственно при открытии подключения.
При этом сразу после открытия базы мы увидим следующее:
$ sqlite3
sqlite> pragma collation_list;
0|russian
1|NOCASE
2|RTRIM
3|BINARY
Таким образом, получаем встроенную поддержку руссого языка, достаточно лишь для поля таблицы указать "collate russian".
Для дебиана можно брать пакеты из моего репозитория. Для виндоус можно взять не сильно свежую версию SQLite с ICU
здесь (вот только не обещаю, что коллэйшен russian там автоматически грузится, поскольку сборку делал отнюдь не для русскоговорящих пользователей). Так что лучше взять последнюю версию SQLite с офсайта, пропатчить и скомпилировать с ICU, который я уже собрал и выложил тут.
Патч объявляет коллэйшен "ru_RU" как "russian" непосредственно при открытии подключения.
--- sqlite3-3.6.19.orig/ext/icu/icu.c
+++ sqlite3-3.6.19/ext/icu/icu.c
@@ -482,6 +482,19 @@
);
}
+ UErrorCode status = U_ZERO_ERROR;
+ UCollator *pUCollator = ucol_open("ru_RU", &status);
+ if( !U_SUCCESS(status) ){
+ return SQLITE_ERROR;
+ }
+
+ rc = sqlite3_create_collation_v2(db, "russian", SQLITE_UTF16, (void *)pUCollator,
+ icuCollationColl, icuCollationDel
+ );
+ if( rc!=SQLITE_OK ){
+ ucol_close(pUCollator);
+ }
+
return rc;
}
Comments