Suche Umlaute in der DB, findet nichts falls groß geschrieben

Hallo zusammen,

mir ist gerade etwas in unserer Datenbankanwendung aufgefallen.

Ich habe einen Datensatz “Martin Übermuth” (großes Ü in dem Datensatz) Jetzt suchen wir:
SELECT id,opt_an_typ,suche,opt_branche,ansprechpartner,ort,telefon,internet,anrede,text,opt_status_an,datum_aenderung FROM an_datei
WHERE ((lower(mobil) like ‘%über%’) OR (lower(suche) like ‘%über%’)) order by lower(opt_an_typ) asc, lower(suche) desc LIMIT 25

nun findet er den Datensatz nicht. Habt ihr dafür eine Lösung parat?

Ist der Wert in der Datenbank klein geschrieben, also Martin übermuth (kleines ü in dem Datensatz) dann findet er ihn. Gibt es da eine Lösung oder muss ich die Eingabe des Kunden vor dem speichern in kleine Buchstaben umwandeln, wäre blöd weil es kann ja auch in der Anschrift sein, die gedruckt wird.

Bei uns kann der Kunde frei bestimmen in welchen Feldern gesucht wird. Muss also nicht das Feld suche sein, wie im obigen Beispiel.

Da gibt es einige mögliche Fehlerquellen.
Angefangen bei der eigenen Tabellendefinition der Spalten, über Environmentsettings bei der Verarbeitung bis zum Quellformat des Datenlieferanten. (Ich hab mal angenommen, dass an_datei auf importierte Daten hindeuten könnte)
Schau mal hier:
https://www.postgresql.org/docs/9.6/static/multibyte.html

Es geht immer darum, das richtige Encoding zu wählen. Beim Erzeugen der DB, beim Importieren, bei der Darstellung.
Auch z.B. beim Encoding von Abfrageparametern, die interaktiv über eine Eingabemaske in einer Suchabfrage landen.

Du musst also wissen, was ist in Deiner DB eingestellt, was macht ggf, ein Importprogramm falsch (oder richtig), wie sieht es mit den Importdaten aus, wie ist das Encoding im Abfrageprogramm.

Nimm ilike statt like.

Funktioniert bei mir:

psql (9.6.4)
Type "help" for help.
postgres=> create table an_datei (id integer, suche text);
CREATE TABLE
postgres=> insert into an_datei values (1, 'Martin Übermuth');
INSERT 0 1
postgres=> select *
postgres-> from an_datei
postgres-> where lower(suche) like '%über%';
 id |      suche
----+-----------------
  1 | Martin Übermuth
(1 row)

postgres=>