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í