La radice del problema si trova qui:
Sto usando SQLite3 per lo sviluppo e PostgreSQL per la distribuzione.
È una cattiva idea™. Continuerai a incorrere in incompatibilità - o peggio:non te ne accorgerai finché il danno non sarà fatto.
Utilizza lo stesso RDBMS (PostgreSQL) per lo sviluppo e la produzione e risparmia inutili problemi.
Mentre sei bloccato con la tua sfortunata configurazione, c'è una semplice soluzione :
lower(style) LIKE lower(?)
Funziona allo stesso modo su entrambe le piattaforme.
-
Puoi rilasciare il
lower()
di destra , se fornisci un modello di ricerca in minuscolo. -
In SQLite standard
lower(X)
piega solo lettere ASCII. Per di più, cito il capitolo Funzioni principali nel manuale di SQLite:La funzione lower(X) restituisce una copia della stringa X con tutti i caratteri ASCII convertiti in minuscolo. La funzione predefinita lower() funziona solo per i caratteri ASCII. Per eseguire conversioni di maiuscole su caratteri non ASCII, carica l'estensione ICU .
Enfasi mia.
-
PostgreSQL
lower(X)
funziona con UTF-8 pronto all'uso.
Come effetto collaterale gradito, puoi accelerare su quella query in PostgreSQL con un indice sull'espressione lower(style)
, che sarà più veloce rispetto all'utilizzo di ILIKE
e un indice di base su style
.
Inoltre, da PostgreSQL 9.1 puoi usare un indice GIN o GIST con il pg_trgm
per velocizzare qualsiasi LIKE
e LIKE
query:i trigrammi non fanno distinzione tra maiuscole e minuscole. Istruzioni dettagliate e collegamenti in questa risposta correlata:
- Stringhe UTF-8 simili per il campo di completamento automatico