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