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

Generisk Ruby-løsning til SQLite3 LIKE eller PostgreSQL ILIKE?

roden til problemet ligger herinde:

Jeg bruger SQLite3 til udvikling og PostgreSQL til implementering.

Det er en dårlig idé™. Du vil blive ved med at løbe ind i inkompatibiliteter - eller endnu værre:ikke indse nogle, før skaden er sket.
Brug den samme RDBMS (PostgreSQL) til udvikling og produktion og spar dig selv for det meningsløse besvær.

Mens du sidder fast med din uheldige opsætning, er der en simpel løsning :

lower(style) LIKE lower(?)

Fungerer på begge platforme ens.

  • Du kan slippe den højre lower() , hvis du angiver et søgemønster med små bogstaver.

  • I standard SQLite lower(X) folder kun ASCII-bogstaver. For mere citerer jeg kapitlet Kernefunktioner i SQLite-manualen:

    Funktionen lower(X) returnerer en kopi af streng X med alle ASCII-tegn konverteret til små bogstaver. Den indbyggede standardfunktion lower() fungerer kun for ASCII-tegn. For at udføre sagskonverteringer på ikke-ASCII-tegn skal du indlæse ICU-udvidelsen .

    Fremhæv min.

  • PostgreSQL lower(X) fungerer med UTF-8 ud af æsken.

Som en velkommen bivirkning kan du hastighede op den forespørgsel i PostgreSQL med et indeks på udtrykket lower(style) , hvilket vil være hurtigere end at bruge ILIKE og et grundlæggende indeks på style .

Siden PostgreSQL 9.1 kan du også bruge et GIN- eller GIST-indeks med pg_trgm udvidelse for at fremskynde enhver LIKE og ILIKE forespørgsel - trigrammer skelner mellem store og små bogstaver. Detaljerede instruktioner og links i dette relaterede svar:

  • Lignende UTF-8-strenge for autofuldførelsesfelt


  1. Flere showplan-forbedringer? Ja tak!

  2. ) Operatør for begyndere

  3. hvordan man laver en tabel i oracle

  4. pg_dump postgres-database fra fjernserver, når port 5432 er blokeret