Die Wurzel des Problems liegt hier drin:
Ich verwende SQLite3 für die Entwicklung und PostgreSQL für die Bereitstellung.
Das ist eine schlechte Idee™. Sie werden immer wieder auf Inkompatibilitäten stoßen - oder schlimmer noch:einige erst erkennen, wenn der Schaden angerichtet ist.
Verwenden Sie dasselbe RDBMS (PostgreSQL) für Entwicklung und Produktion und ersparen Sie sich den sinnlosen Ärger.
Während Sie mit Ihrem unglücklichen Setup festsitzen, gibt es eine einfache Lösung :
lower(style) LIKE lower(?)
Funktioniert auf beiden Plattformen gleichermaßen.
-
Sie können das rechte
lower()
fallen lassen , wenn Sie ein Kleinbuchstaben-Suchmuster angeben. -
In Standard-SQLite
lower(X)
faltet nur ASCII-Buchstaben. Für mehr zitiere ich das Kapitel Kernfunktionen im SQLite-Handbuch:Die Funktion lower(X) gibt eine Kopie der Zeichenfolge X zurück, wobei alle ASCII-Zeichen in Kleinbuchstaben umgewandelt wurden. Die standardmäßig eingebaute Funktion lower() funktioniert nur für ASCII-Zeichen. Um Groß- und Kleinschreibung auf Nicht-ASCII-Zeichen umzuwandeln, laden Sie die ICU-Erweiterung .
Hervorhebung von mir.
-
PostgreSQL
lower(X)
funktioniert sofort mit UTF-8.
Als willkommener Nebeneffekt können Sie beschleunigen up diese Abfrage in PostgreSQL mit einem Index auf den Ausdruck lower(style)
, was schneller ist als die Verwendung von ILIKE
und ein grundlegender Index für style
.
Außerdem können Sie seit PostgreSQL 9.1 einen GIN- oder GIST-Index mit pg_trgm
verwenden Erweiterung, um beliebige zu beschleunigen LIKE
und ILIKE
Abfrage - Bei Trigrammen wird die Groß-/Kleinschreibung nicht beachtet. Detaillierte Anweisungen und Links in dieser verwandten Antwort:
- Ähnliche UTF-8-Strings für das Autocomplete-Feld