źródło problemu leży tutaj:
Używam SQLite3 do programowania i PostgreSQL do wdrażania.
To zły pomysł™. Będziesz ciągle napotykał niezgodności - lub, co gorsza:nie zdawaj sobie z nich sprawy, dopóki nie nastąpi uszkodzenie.
Używaj tego samego RDBMS (PostgreSQL) do programowania i produkcji i oszczędź sobie bezsensownych kłopotów.
Kiedy utkniesz ze swoją niefortunną konfiguracją, istnieje prosta poprawka :
lower(style) LIKE lower(?)
Działa na obu platformach jednakowo.
-
Możesz upuścić prawy
lower()
, jeśli podasz wzorzec wyszukiwania pisany małymi literami. -
W standardowym SQLite
lower(X)
składa tylko litery ASCII. Więcej informacji można znaleźć w rozdziale Podstawowe funkcje w podręczniku SQLite:Funkcja lower(X) zwraca kopię ciągu X ze wszystkimi znakami ASCII zamienionymi na małe litery. Domyślna wbudowana funkcja lower() działa tylko dla znaków ASCII. Aby wykonać konwersję wielkości liter na znakach spoza ASCII, załaduj rozszerzenie ICU .
Podkreśl moje.
-
PostgreSQL
lower(X)
działa z UTF-8 po wyjęciu z pudełka.
Jako pożądany efekt uboczny możesz przyspieszyć w górę tego zapytania w PostgreSQL z indeksem na wyrażeniu lower(style)
, co będzie szybsze niż użycie ILIKE
i podstawowy indeks style
.
Ponadto od PostgreSQL 9.1 możesz używać indeksu GIN lub GIST z pg_trgm
rozszerzenie przyspieszające dowolne LIKE
i ILIKE
zapytanie — w trygramach nie jest rozróżniana wielkość liter. Szczegółowe instrukcje i linki w tej powiązanej odpowiedzi:
- Podobne ciągi UTF-8 dla pola autouzupełniania