sql >> Database >  >> RDS >> PostgreSQL

Generieke Ruby-oplossing voor SQLite3 LIKE of PostgreSQL ILIKE?

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


  1. Combineer twee tabellen die geen gemeenschappelijke velden hebben

  2. EEE MMM dd HH:mm:ss ZZZ jjjj datumnotatie naar java.sql.Datum

  3. Verbinding maken met een MySQL-gegevensbron in Visual Studio

  4. Rijprestaties voor PostgreSQL met HAProxy