Sonderzeichen kommen in DB falsch an

suntrop

Erfahrenes Mitglied
Hi,

seitdem ich auf Mac OS X umgestiegen bin, nutze ich nur noch UTF-8, auch im Büro wo ich unter WinXP arbeite.

  • Editor ist auf Unicode UTF-8 eingestellt (ohne BOM).
  • phpmyAdmin Tabelle steht auf utf8_unicode_ci (stand vorher auch mal auf utf8_general_ci)
  • Felder stehen auf utf8_unicode_ci (stand vorher auch mal auf utf8_general_ci)
  • In allen Seiten steht <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  • zusätzlich noch header("Content-Type: text/html; charset=utf-8");
  • und das Formular trägt noch den hübschen Zusatz accept-charset="utf-8"

Trotz all dieser Maßnahmen landen die Eingaben, aus meinem Formular, falsch in der DB. Denn phpmyadmin zeigt mir statt Köln Köln an. Auch auf der Website.

Jetzt gerade habe ich gemerkt: Wenn ich
Code:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
aus der Datei (die für die Anzeige zuständig ist) entferne, dann werden die Sonderzeichen, aus dem Formular korrekt angezeigt, jedoch nicht die die ich vorher und später über phpmyAdmin eingespeist habe.

  1. Welche Kollation soll ich in phpmyAdmin einstellen? utf_unicode_ci oder utf_gerneral_ci
  2. Warum macht mir mysql_query("SET NAMES 'utf8'"); und mysql_query("SET CHARACTER SET 'utf8'"); meine UTF-8 Datensätze kaputt?
  3. Was muss ich umstellen (wo kann ich noch was prüfen), damit ich über das Formular und phpmyAdmin Daten eingeben kann?
Grüße
suntrop
 
Es ist pauchal gesagt egal, ob du utf_unicode_ci oder utf_general_ci verwendest. Wichtig ist, dass von Anfang an alle Daten schon als Unicode gespeichert wurden und du nicht einfach nur dieTabellen und Spaltendefinition geändert hast von latin-1 in utf-8.

Wenn du per PHP im HTTP-Header utf-8 mitgibst, kannst du dir den meta-tag sparen. Am besten ist eigentlich, man stellt in der php.ini und in der apache2.conf (bei Apache2) auf den Default Charste UTF-8 um.

SQL:
SET NAMES utf-8;
Dieses Statement bewirkt, dass MySQL alle Datensätze vor der Übertragung in UTF-8 kodiert und sie somit bei PHP als UTF-8 Strings ankommen. Das dürfte eigentlich keine Probleme bereiten.

Ebenso denke ich kannst du dir das accept-charset bei den Formularen sparen.

Ich glaube wirklich, dass du gemischte Datensätze in Latin-1 und UTF-8 hast. Genau dieses verhalten kenne ich aus meinen ersten Versuchen mit UTF-8 ;)
 
Es gäbe noch eine andere möglichkeit. Wenn man die Daten die von einem php skript in die Datenbank schreibt und später wieder auf einer Website anzeigen will kann (bzw sollte) man sie in htmlcode umwandeln. ü=&uuml; usw
 
Danke an euch für die Antworten.

@Busi
Das ist auch eine Möglichkeit. Jedoch möchte ich den Fehler nicht umgehen, sondern beseitigen.

@Radhad
Ich habe gleich beim Anlegen der Tabelle angegeben, dass es sich um utf_general_ci handelt. Später habe ich dann zum Testen auf utf_unicode_ci umgestellt (ohne Erfolg).
Die Dateien sind in jedem Fall als UFT-8 gespeichert, ich habe alle Editoren so eingestellt und was anderes nutze ich gar nicht erst.

Jedoch vermute ich auch das da irgendwo Latin-1 mit im Spiel ist. Denn warum sollte sonst der Zeichensatz stimmen, wenn ich SET NAMES utf-8; entferne? Das heißt ja wohl, das da Nicht-UTF-8 Zeichen (wahrscheinlich ISO 8859-1) enthalten sein müssen.

Wie die dort reinkommen kann ich mir jedoch wie gesagt nicht erklären. Ich werde von zu Hause (unter OS X) nochmal alles abspeichern. Ansonsten weiß ich echt nicht weiter.

Auf die php.ini habe ich Zugriff, auf die httpd.conf leider nicht (ManagedServer). Kann es sein, dass in einer von beiden etwas steht, das verhindert, dass ich UTF-8 "übertragen" oder an den Server senden kann? Eine Einstellung die nicht überschreiben werden kann?

Grüße
suntrop
 
Ich habe jetzt festgestellt, dass Daten die aus dem Formular stammen in phpmyAdmin falsch angezeigt werden, auf meiner Website jedoch wieder korrekt sind (mysql_query("SET NAMES 'utf8'"); habe ich entfernt).

Da ich jedoch Änderungen über phpmyAdmin vornehmen muss, muss das Tool auch korrekt funktionieren. Denn, wenn ich im Moment etwas ändere und speicher, werden die defekten Stellen (ß, ö etc.) auch gespeichert und auf meiner Website ausgegeben.

Ich blicke da mittlerweile nicht mehr durch. Sind meine Daten jetzt in Latin-1 gespeichert? Aber wie kann das sein? Auf der Fomularseite und auf allen Ausgabeseiten steht <meta http-equiv="content-type" content="text/html; charset=utf-8" /> sowie header("Content-Type: text/html; charset=utf-8"); und auch in der DB steht laut phpmyAdmin nirgdendwo mehr Latin-1 nur noch utf-8.

Kann das Problem vielleicht phpmyAdmin selber sein?
Wie kann ich das testen? Am besten zwei extra Seiten anlegen, einmal UTF-8 einmal Latin-1 und dann alle Kombinationen durchgehen? Wie gehe ich da am besten vor?

Grüße
suntrop
 
Ich hatte mal ähnliche Probleme. Dannach habe ich die PHP Funktionen utf8_encode() und utf8_decode() benutzt dannach hat eigentlich alles geklappt.
 
Hi,
prüfe deine Encodierung doch erstmal an den kritischen Stellen mit:
mb_check_encoding - http://de.php.net/manual/de/function.mb-check-encoding.php
Ah, danke für den Tipp. Das kannte ich noch nicht. Werde ich gleich morgen früh mal testen und sagen was dabei raus kam.

Ich hatte mal ähnliche Probleme. Dannach habe ich die PHP Funktionen utf8_encode() und utf8_decode() benutzt dannach hat eigentlich alles geklappt.
Die zwei Gesellen kenne ich. Jedoch kann ich die nicht in phpmyAdmin nutzen und zum anderen sind die nur für vereinzelte Felder nutzbar. Es liegt bestimmt nicht im Sinne des Erfinders, alle Daten extra nochmal mit utf8_encode() und decode() umzuwandeln. Dennoch danke für den Tipp boyben.

Grüße
suntrop
 
Hallo,

ich verstehe überhaupt nicht wie ich die Funktion anwenden muss.

bool mb_check_encoding ([ string $var [, string $encoding ]] )


Ich hatte es jetzt so versucht:
mb_check_encoding($row['id'], 'utf8_unicode_ci'); Nur gibt mir dieser Code einfach die ID-Nummer aus.

Wie muss ich das schreiben, um zu erfahren welche Kodierung in der DB steht?


Grüße
suntrop
 
Ich habe jetzt mit diesem Konstrukt…
Code:
while ($row = mysql_fetch_object($rs))
{
	$name = $row -> first_name;
	if( mb_check_encoding($name, "Unicode") == true)
	{
		echo $row->id.": Unicode<br>";
	}
	else
	{
		echo $row->id.": Non-Unicode<br>";
	}
}
versucht herauszufinden, was Unicode ist und was nicht.

Wenn ich auf Unicode prüfe, dann erhalte ich fast 50/50 Unicode und Non-Unicode.
Wenn ich auf "UTF-8" prüfe, dann gibt es nur einmal (von 22) Non-Unicode. Und diesen Eintrag hatte ich mal mit phpmyAdmin geändert.

Komisch ist:
  • Die Einträge die ich vor einigen Tagen mit dem Safari über das Formular eingetragen habe, werden bei der Prüfung auf Unicode als Non-Unicode deklariert.
  • Einträge die ich jetzt (FF, WinXP) über das Formular mache werden als Unicode deklariert (werden in pma falsch, auf meiner Website korrekt angezeigt).
  • Einträge die ich jetzt über pma eingebe, werden in pma korrekt auf meiner Website falsch angezeigt und als Non-Unicode deklariert.

Das ganze bringt mich immer mehr durcheinander. Je mehr ich weiß, desto größer die Verwirrung.
 
Zurück