Коренът на проблемата се намира тук:
Използвам SQLite3 за разработка и PostgreSQL за внедряване.
Това е лоша идея™. Ще продължите да се сблъсквате с несъвместимости - или по-лошо:няма да осъзнавате някои, докато не бъде нанесена щета.
Използвайте същата RDBMS (PostgreSQL) за разработка и производство и си спестете безсмислените проблеми.
Докато сте заседнали с вашата злощастна настройка, има просто решение :
lower(style) LIKE lower(?)
Работи и на двете платформи.
-
Можете да пуснете дясната
lower()
, ако предоставите модел за търсене с малки букви. -
В стандартния SQLite
lower(X)
сгъва само ASCII букви. За повече информация цитирам главата Основни функции в ръководството за SQLite:Функцията lower(X) връща копие на низ X с всички ASCII знаци, преобразувани в малки букви. Вградената по подразбиране low() функция работи само за ASCII знаци. За да извършите преобразуване на главни и главни букви върху знаци, които не са ASCII, заредете разширението ICU .
Акцент мой.
-
PostgreSQL
lower(X)
работи с UTF-8 от кутията.
Като добре дошъл страничен ефект можете да ускоритете повишете тази заявка в PostgreSQL с индекс на израза lower(style)
, което ще бъде по-бързо от използването на ILIKE
и основен индекс на style
.
Освен това, от PostgreSQL 9.1 можете да използвате GIN или GIST индекс с pg_trgm
разширение за ускоряване на всяко LIKE
и ILIKE
заявка - триграмите не са чувствителни към главни букви. Подробни инструкции и връзки в този свързан отговор:
- Подобни UTF-8 низове за поле за автоматично довършване