Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

Sqlite игнорировать регистр в условии WHERE

Подскажите как на андроиде в sqlite базе сделать выборку на кирилице, игнорируя регистр? запросы с LIKE, COLLATE NOCASE и UPPER(column_name) работают только для английских букв! А для русских нет! Для примера, имею таблицу favourite с записью title = Тест, юзер пытается запросить её но в поле поиска вводит слово тест маленькими буквами. пробовал такие варианты: SELECT * FROM favourite WHERE title LIKE '%тест%' SELECT * FROM favourite WHERE UPPER(title) LIKE UPPER('%тест%') SELECT * FROM favourite WHERE title LIKE '%ТЕСТ%' COLLATE NOCASE все три варианта не подходят, больше ничего не нагуглил. Подскажите пожалуйста решение ps: запросы осуществляю так: SQLiteDatabase db = getWritableDatabase(); //*extends SQLiteOpenHelper* Cursor cursor = db.rawQuery(sql, null);


Ответ

Вообще-то это известный баг или фича (кому как) SQLite. Он не понимает case-insensitive where/like/glob, когда символы не в ASCII. Как говорит мануал: A bug: SQLite only understands upper/lower case for ASCII characters by default. The LIKE operator is case sensitive by default for unicode characters that are beyond the ASCII range. For example, the expression 'a' LIKE 'A' is TRUE but 'æ' LIKE 'Æ' is FALSE.) Единственный способ обойти это ограничение, это завести хранимую процедуру выполняющую операцию сравнения. Update Я слегка погорячился по поводу хранимых процедур в SQLite. SQLite не поддерживает хранимые процедуры в общепринятом смысле, нужно писать т.н. custom function на С, пример здесь

Комментариев нет:

Отправить комментарий