Problem mit Umlauten bei einer SQL Abfrage, hat jemand eine Idee?
Guten Morgen zusammen,
heute habe ich folgendes Problem:
suche ich z.B. nach „ Müller“ oder Mueller, dann bekomme ich kein Ergebnis angezeigt
SQL-Abfrage:
("SELECT * FROM kdverwaltung WHERE name LIKE '%$suche%' OR vorname LIKE '%$suche%'")
Kollation
utf8_general_ci
3 Antworten
Deine PHP-Datei ist wie abgespeichert (Zeichensatz)?
Deine HTML-Seite lautet auf welchen Zeichensatz (Meta-Tag usw.)?
Deine Datenbankverbindung lautet auf welchem Zeichensatz (set names)?
Die Datensätze sind korrekt in der DB drin, wurden also wirklich als utf8 angelegt und übergeben (siehe beispielsweise mysql-kommandozeile)?
Die Like-Suche ist im übrigen KEINE phonetische Suche. Wenn in der Datenbank "müller" steht, wird die Suche nach "mueller" niemals ein Ergebnis liefern.
ich bin blutiger Anfänger auf dem Gebiet
Macht nichts, deswegen die Fragen ;-)
So wie du diese Fragen beantwortet hast, sollte es zunächst grundsätzlich klappen. Also hinsichtlich der Abfrage auf den exakt richtigen Wert. Wichtig ist, dass wirklich von Anfang bis Ende, also sowohl im HTML/Header (-> Browser), als auch im PHP-Script, als auch in der Datenbankverbindung (Set Names) als auch in der Tabelle (Collation) alles auf UTF8 steht. Ansonsten sucht man sich dumm und dusselig.
Wenn du die Datensätze abfragst und als einfache Tabelle in der Webseite abfragst, siehst es dann korrekt aus oder sieht der Umlaut kaputt aus?
Und wie löse ich dieses Problemchen? ;-)
Indem du Google bedienen lernst ;-)
Gleich der erste Suchtreffer für "mysql phonetische Suche" führt mich zu folgendem interessanten Forumseintrag: https://www.tutorials.de/threads/php-mysql-aehnlichkeitssuche-meinten-sie.360632/
Hoffentlich habe ich mich nicht falsch ausgedrückt….
Die Umlaute werden richtig angezeigt.
Was nicht funktioniert ist, dass Wörter die ein Umlaut beinhalten
nicht gefunden (ausgegeben) werden.
Ich habe es!
Es war etwas ganz anderes.
Der Fehler entstand, da ich
einen Befehl falsch verwendete
Ich schrieb:
$suche = preg_replace ("#[^0-9a-z]#i","", $suche);
Damit wurde alles, außer Wörter mit Umlauten ausgegeben.
So funktioniert es:
$suche = preg_replace ("#[^0-9a-zäÄüÜöÖß]#i " ," " , $suche);
Vielen Dank an die helfen wollten :-)
Nutze bitte Zeichenklassen statt "0-9a-zäÄüÜöÖß".
Beispielsweise \w
siehe auch https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Vordefinierte_Zeichenklassen
Dann wird es auch mit "exotischen Zeichen" zurechtkommen, beispielsweise diesen Strichen, die Franzosen gerne über die Buchstaben malen oder den Kringeln aus dem nordischen Raum oder oder. Der Modifier "u" zusätzlich zum "i" bewirkt, dass dein Regex als Unicode interpretiert wird :-)
Versuch mal die Variable String umzuändern:
$string = utf8_encode($string);
Und dann mach die Abfrage nochmal
Müller, Mueller, vielleicht auch Miller, Möller, ... nicht so trivial. google mal nach levenshtein
Vielen Dank für deine Antwort!
Gleich vorab, ich bin blutiger Anfänger auf dem Gebiet. Um
genau zu sein, reden wir von meinem 1. Script. Ich hoffe, Du bist nachsichtig
mit mir….
Deine PHP-Datei ist wie abgespeichert (Zeichensatz)?
JA
Deine HTML-Seite lautet auf welchen Zeichensatz
(Meta-Tag usw.)?
<meta charset="utf-8">
Zusätzlich binde ich mit PHP
folgendes ein:
header("Content-Type: text/html; charset=utf-8");
Die Datensätze sind korrekt in der DB drin,
wurden also wirklich als utf8 angelegt und übergeben (siehe beispielsweise mysql-kommandozeile)?
Verstehe nicht genau was Du damit meinst. Also die Umlaute werden korrekt in der DB abgespeichert. Ich musste diesen Befehl dafür einfügen:
mysql_query("SET NAMES 'utf8'");
Die Like-Suche ist im übrigen
KEINE phonetische Suche. Wenn in der Datenbank "müller" steht, wird die Suche nach "mueller" niemals ein Ergebnis liefern.
Und wie löse ich dieses Problemchen? ;-)