De wortel van het probleem ligt hierin:
Ik gebruik SQLite3 voor ontwikkeling en PostgreSQL voor implementatie.
Dat is een slecht idee™. Je zult steeds tegen onverenigbaarheden aanlopen - of erger nog:realiseer je er pas een als de schade is aangericht.
Gebruik hetzelfde RDBMS (PostgreSQL) voor ontwikkeling en productie en bespaar jezelf de zinloze moeite.
Hoewel je vastzit aan je ongelukkige configuratie, is er een eenvoudige oplossing :
lower(style) LIKE lower(?)
Werkt op beide platforms.
-
Je kunt de rechtse
lower()
, als u een zoekpatroon in kleine letters opgeeft. -
In standaard SQLite
lower(X)
vouwt alleen ASCII-letters. Voor meer informatie citeer ik het hoofdstuk Kernfuncties in de SQLite-handleiding:De functie lower(X) retourneert een kopie van tekenreeks X met alle ASCII-tekens geconverteerd naar kleine letters. De standaard ingebouwde lower()-functie werkt alleen voor ASCII-tekens. Om hoofdletterconversies uit te voeren op niet-ASCII-tekens, laad de ICU-extensie .
Benadruk de mijne.
-
PostgreSQL
lower(X)
werkt standaard met UTF-8.
Als een welkome bijwerking kun je versnellen verhoog die query in PostgreSQL met een index op de uitdrukking lower(style)
, wat sneller zal zijn dan het gebruik van ILIKE
en een basisindex op style
.
Bovendien kunt u sinds PostgreSQL 9.1 een GIN- of GIST-index gebruiken met de pg_trgm
extensie om elke . te versnellen LIKE
en ILIKE
query - trigrammen zijn niet hoofdlettergevoelig. Gedetailleerde instructies en links in dit gerelateerde antwoord:
- Vergelijkbare UTF-8-tekenreeksen voor automatisch aanvullen-veld