PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Soluzione Ruby generica per SQLite3 LIKE o PostgreSQL ILIKE?

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