Kořen problému leží zde:
Používám SQLite3 pro vývoj a PostgreSQL pro nasazení.
To je špatný nápad™. Stále budete narážet na nekompatibility - nebo ještě hůř:některé si neuvědomíte, dokud nedojde k poškození.
Používejte stejné RDBMS (PostgreSQL) pro vývoj a produkci a ušetříte si zbytečné problémy.
Zatímco jste uvízli ve svém nešťastném nastavení, existuje jednoduchá oprava :
lower(style) LIKE lower(?)
Funguje na obou platformách stejně.
-
Pravé
lower()
můžete vypustit , pokud zadáte vyhledávací vzor s malými písmeny. -
Ve standardním SQLite
lower(X)
složí pouze písmena ASCII. Pro více cituji kapitolu Core Functions v SQLite manuálu:Funkce Lower(X) vrací kopii řetězce X se všemi znaky ASCII převedenými na malá písmena. Výchozí vestavěná funkce lower() funguje pouze pro znaky ASCII. Chcete-li provádět převody malých a velkých písmen na znaky jiné než ASCII, načtěte rozšíření ICU .
Zdůrazněte můj.
-
PostgreSQL
lower(X)
pracuje s UTF-8 ihned po vybalení.
Jako vítaný vedlejší efekt můžete zrychlit nahoru tento dotaz v PostgreSQL s indexem na výrazu lower(style)
, což bude rychlejší než použití ILIKE
a základní index na style
.
Od PostgreSQL 9.1 můžete také použít index GIN nebo GIST s pg_trgm
rozšíření pro urychlení jakéhokoli ILIKE
a ILIKE
dotaz - trigramy nerozlišují malá a velká písmena. Podrobné pokyny a odkazy v této související odpovědi:
- Podobné řetězce UTF-8 pro pole automatického doplňování