Umlaute in Datenbank schreiben
Sebastian
- datenbank
Hallo!
Habe leider nach vielem Suchen nicht das richtige gefunden...bzw. ich verstehe es nicht richtig!
Habe eine HTML-Formular erstellt, das daten vom benutzer einliest. diese werden dann mit php in die mysqldatenbank eingespielt. leider funktioniert das nicht richtig...umlaute werden nicht richtig angezeigt (in der datenbank).
wenn ich die umlaute manuell in die datenbank eingebe, dann werden die daten richtig weiterverarbeitet (die datenbank hab ich auf utf8 gestellt genauso wie ein htmlcode) und ich verwende noch htmlentities() da sonst doch nicht alles richtig angezeigt worden wäre.
also muss das problem beim einschreiben in die datenbank liegen...geht da schon was beim post schief? oder ist es wirklich das einschreiben? wie kann ich die umlaute korrekt in die datenbank bekommen?
wäre euch sehr dankbar wenn ihr mir helfen könntet!
Liebe Grüße,
Sebastian
Encodings... why did it have to be Encodings?
Du hast ein Zeichensatzproblem. Schau mal, mit welchem Charset Deine Webseite ausgeliefert wird und die Formulardaten reinkommen und welchen Zeichensatz Deine Datenbank verwendet.
Ich nehme an, eins von beiden läuft mit ISO-8859-1 und das andere mit UTF-8 (wobei ich ziemlich sicher bin, dass die Datenbank UTF-8 verwendet, sofern Du sie in der Standardeinstellung belassen hast).
Gruß, LX
echo $begrüßung;
Habe leider nach vielem Suchen nicht das richtige gefunden...bzw. ich verstehe es nicht richtig!
Wenn du konkret werden würdest, könnte man versuchen, das Verständnisproblem direkt zu lösen.
Habe eine HTML-Formular erstellt, das daten vom benutzer einliest. diese werden dann mit php in die mysqldatenbank eingespielt. leider funktioniert das nicht richtig...umlaute werden nicht richtig angezeigt (in der datenbank).
Aus der Art der "Nicht-Richtigkeit" kann ein geübtes Auge oft erkennen, was konkret schiefläuft. Bitte beobachte und beschreibe genauer, wenn man dir gezielter helfen soll.
wenn ich die umlaute manuell in die datenbank eingebe, dann werden die daten richtig weiterverarbeitet
Was bedeutet "manuell"?
(die datenbank hab ich auf utf8 gestellt genauso wie ein htmlcode) und ich verwende noch htmlentities() da sonst doch nicht alles richtig angezeigt worden wäre.
also muss das problem beim einschreiben in die datenbank liegen...geht da schon was beim post schief? oder ist es wirklich das einschreiben? wie kann ich die umlaute korrekt in die datenbank bekommen?
Grundsätzlich muss jeder Beteiligte am Gesamtprozess a) mit der gewählten Zeichenkodierung umgehen können und b) über die zu verwendende Zeichenkodierung informiert werden.
Beteiligte sind der Browser, PHP und MySQL. PHP ist im Prinzip (noch) nicht fähig, mit UTF-8 umzugehen, sieht man mal von der nicht zum Default gehörenden Multibyte-String-Extension ab. Das ist jedoch egal, solange du die Daten nur durchreichst und keine Stringverarbeitung (z.B. Zeichen zählen, String trennen) benötigst. Browser sind im Allgemeinen Unicode- und UTF-8-fähig. MySQL ist es seit Version 4.1. Für die Datenspeicherung ist allein die Kodierungsangabe der einzelnen Felder interessant. Datenbank- und Tabellen-Kodierungsangaben sind nur Defaultwerte für neu anzulegende Tabellen und Felder, wenn dabei keine explizite Angabe gemacht wird.
Für Punkt b) ist es wichtig, die Stellen zu kennen, an denen die Kodierung für den jeweiligen Empfänger bekanntgegeben wird, und natürlich auch, dass dann diese Kodierung verwendet wird. Jeder Client eines MySQL-Servers tut gut daran, sich die zu verwendende Kodierung explizit für jede Verbindung (sprich: direkt nach dem Verbindungsaufbau) auszuhandeln, sonst wird irgendein Default-Wert verwendet. mysql(i)_set_charset() oder als Alternative ein SET NAMES-Statement sind dafür angebracht. Der Browser bekommt die Angabe über die charset-Angabe im HTTP-Header Content-Type oder, wenn der fehlt, über die gleichlautende HTML-Meta-Angabe. Bei HTML-Formularen sollte man das accept-charset-Attribut angeben, dem der Browser entnehmen soll, welche Kodierung er zum Senden der Daten zum Server verwenden soll.
Grundsätzlich solltest du bei Unklarheiten, auch solchen mit der Zeichenkodierung, jeden Schritt einzeln prüfen, Kontrollausgaben machen und die Zwischenergebnisse kontrollieren und zu verstehen versuchen. Bei Zeichenkodierungsproblemen kann eine Anzeige der Hex-Werte der Datenbytes hilfreich sein.
echo "$verabschiedung $name";
Aus der Art der "Nicht-Richtigkeit" kann ein geübtes Auge oft erkennen, was konkret schiefläuft. Bitte beobachte und beschreibe genauer, wenn man dir gezielter helfen soll.
Also, der Umlaut ö wird z.B als ö dargestellt...
Was bedeutet "manuell"?
Mit manueller Eingabe meine ich, dass ich die Datenbank mit einer Verwaltungsoerfläche von 1und1 bearbeite. Also nicht mit PHP hineinschreiben lasse, sondern alle Daten selbst reinstelle
in meinem <head> habe ich folgenden Eintrag stehen:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
mein Browser kann normalerweise Umlaute anzeigen...
und meine MYSQL Datenbank hab ich auf den Standardeinstellungen gelassen, die ist automatisch uft-8
Woran kann das sonst noch liegen?
Ich hoffe ihr könnt mir helfen!
Sebastian
Mahlzeit Sebastian,
Was bedeutet "manuell"?
Mit manueller Eingabe meine ich, dass ich die Datenbank mit einer Verwaltungsoerfläche von 1und1 bearbeite. Also nicht mit PHP hineinschreiben lasse, sondern alle Daten selbst reinstelle
Und diese Verwaltungsoberfläche - was ist das? Sind das nicht auch nur ein Haufen PHP-Skripte (bei denen dann aber sämtliche Codierungsangaben korrekt sind)?
und meine MYSQL Datenbank hab ich auf den Standardeinstellungen gelassen, die ist automatisch uft-8
Und was ist mit der Datenbankverbindung (wie dedlfix ja auch bereits bemerkte)? Ist die auch auf UTF-8 eingestellt?
MfG,
EKKi
echo $begrüßung;
Aus der Art der "Nicht-Richtigkeit" kann ein geübtes Auge oft erkennen, was konkret schiefläuft. Bitte beobachte und beschreibe genauer, wenn man dir gezielter helfen soll.
Also, der Umlaut ö wird z.B als ö dargestellt...
Das ist ein UTF-8-ö, das als ISO-8859-1/Latin1 interpretiert wurde.
Was bedeutet "manuell"?
Mit manueller Eingabe meine ich, dass ich die Datenbank mit einer Verwaltungsoerfläche von 1und1 bearbeite. Also nicht mit PHP hineinschreiben lasse, sondern alle Daten selbst reinstelle
Diese Verwaltungsoberfläche dürfte ein phpMyAdmin sein. Der hat seine Hausaufgaben gemacht und weiß, wie er korrekt mit dem DBMS zu sprechen hat.
in meinem <head> habe ich folgenden Eintrag stehen:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Das verwendet ein Browser als Ersatz, wenn er keine charset-Angabe im gleichnamigen HTTP-Header findet. Ob dein Webserver da was mitsendet kannst du beispielsweise mit der Firefox-Extension livehttpheaders prüfen.
mein Browser kann normalerweise Umlaute anzeigen...
Um das Anzeigen geht es nicht direkt. Der Browser muss den ankommenden Bytestrom richtig interpretieren, damit er die richtigen Zeichen anzeigen kann.
und meine MYSQL Datenbank hab ich auf den Standardeinstellungen gelassen, die ist automatisch uft-8
Auch das DBMS muss die ankommenden Daten richtig interpretieren. Dazu ist es notwendig, dass es über die Kodierung informiert wurde. Das Speichern der Daten ist eine Sache. Das Empfangen und Versenden von und an Clients eine andere. Sind beide Angaben (Feld- und Verbindungskodierung) unterschiedlich kodiert MySQL selbständig hin und her. 1und1 wird die Verbindungskodierung sicher nicht per Default auf UTF-8 gesetzt haben, weil damit viel mehr Kunden Probleme haben dürften, die ihre Daten in ISO-8859-1/Latin1 übertragen. UTF-8-kodierte Daten können hingegen problemlos über eine ISO-8859-1/Latin1-Verbindung gesendet werden, nur beim Interpretieren auf Empfängerseite kommt Murks raus.
Woran kann das sonst noch liegen?
Wie ich schon empfahl: Verlass dich nicht auf Defaultwerte, handle explizit eine Kodierung auf der Verbindung zwischen PHP und MySQL aus (mysql(i)_set_charset() oder SET NAMES).
echo "$verabschiedung $name";