Warum findet mySQL keine Einträge mit Umlauten?
Hallo zusammen
Ja, es tut mir leid. Ich weiß, dass Charset-Fragen so oft gestellt werden und es viele Google-Ergebnisse dazu gibt. Ich habe das Gefühl, alles getestet zu haben und verstehe grade nicht im Geringsten, was da los ist.
Das Problem: Mittels PHP und scandir() schreibe ich alle Ordner und Dateien mehrerer Verzeichnisse in eine mySQL-Datenbank. Das funktioniert super.
In den entsprechenden Feldern in der Datenbank steht unter "Kollation" überall "utf8_general_ci". Mit PHP setze ich ebenfalls alles auf UTF8 und darum glaube ich, müsste das doch stimmen.
Wenn ich nun aber mit PHP und mysqli() ODER auch einfach als SQL-Befehl nach einem Eintrag mit Umlaut suche, wird er nicht angezeigt. Ersetze ich die Umlaute mit einem %, funktioniert es.
Ein Beispiel an id 11 - die sieht so aus:
Wenn ich nun nicht nach id 11, sondern nach filename suche, geht das nicht mehr, auch wenn ich 1:1 copy & paste mache:
Ich habe auch schon versucht, ganz am Anfang bei scandir(), wo ja in die Datenbank geschrieben wird, überall utf8_encode() zu benutzen, aber dann werden die Umlaute unleserlich gemacht.
2 Antworten
n den entsprechenden Feldern in der Datenbank steht unter "Kollation" überall "utf8_general_ci".
Damit legst Du Kriterien für die Sortierung fest aber nicht für die Suche.
Schick zuerst ein SET NAMES utf8 an die Datenbank, dan sollte es klappen. Mit PDO umgesetzt würd das also so aussehen:
$pdo->query("SET NAMES 'utf8'");
Mit mysqli zum Beispiel so:
mysqli_query($connection,"SET NAMES 'utf8'");
Alex
Aha danke, das mit der Sortierung ist gut zu wissen.
Aber SET NAMES zeigt leider keine Wirkung.
Puh... wo soll man da Anfangen? :-)
Erst einmal ist es ziemlich kacke Leerzeichen in Pfad und Dateinamen zu haben. Umlaut sind auch nicht so geil. (Ich vermute du bist ein Windows User.)
Dann macht deine SQL Abfrage keinen Sinn. "LIKE" bedeutet das du etwas suchst und einen Teil nicht weißt. Den füllst Du dann mit einem Platzhalter "%". Also z.B. "... WHERE filename LIKE "5 Harry Potter und der Orden%". SQL gibt dir dann alles zurück was mit "5 Harry Potter und der Orden" anfängt. In deinem Beispiel oben sollte man "=" (statt "LIKE") verwenden, da du ja eh den kompletten Namen eingibst.
Warum bekommst du jetzt den Datensatz nicht? Vielleicht ist ein unsichtbares Zeichen im String (Leerzeichen, Line Break, etc.)
Vielleicht ist dein SQL-String falsch (hast du ihn dir schon mal ausgeben lassen?).
Ist die Codierung deiner Seite auch UTF8?
Vielleicht bastelst du so viel überall mit Charsets rum das einfach alles nicht mehr passt. Hast du schon mal versucht die ganze Charset-Bastelei weg zu lassen und es absolut ohne zu probieren?