Encding Problem mit MySQL

WhiZZler

Chancentod²
ID: 85586
L
6 Mai 2006
588
32
begrüße!

ich habe nen encoding problem, das mich nen bisschen zur verzweiflung bringt.. ich lese ganz normal aus einer mysql datenbank datensätze aus.. die datenbank hat als encoding UTF-8, das php script, das die daten ausliest hat als encoding UTF-8, die html seite, auf der die daten angezeigt werden hat ebenfalls UFT-8..

ich bekomme trotzdem lustige fragezeichen (�) anstelle von umlauten angezeigt.. ich weiß echt nich so recht, was ich noch versuchen soll.. die spalten, in denen der text mit den umlauten steht haben als kollation latin1_swedish_ci .. ich habe auch versucht die kollation auf utf8_bin zu ändern.. hat auch kein anderes ergebnis gebracht..

im phpmyadmin werden die umlaute korrekt angezeigt.. es liegt also nicht daran, dass die umlaute schon verpfuscht gespeichert wurden..

wäre für jeden hinweis dankbar.. bin wie gesagt mit meinem latein am ende ;)

danke im voraus,
mfg,
whizzler
 
der zeichensatz war iso-8859-1
habe es auf utf-8 geändert.. es hat sich aber nichts geändert..

habe jetzt gerade erst den thread von greaseball zu einem ähnlichen bzw dem gleichen problem gefunden.. dort hat mir dieser post von Xot geholfen:

Versuch mal bevor du etwas in die Datenbank einträgst:
PHP:
$query = "SET NAMES 'utf8'";
mysql_query($query);

Edit: Oder so https://www.php.net/manual/de/function.mysql-set-charset.php

mit mysql_set_charset() funktioniert es jetzt.. ich hab zwar keine ahnung warum, aber das is mir jetzt auch ziemlich egal, da es sich sowieso nur um ein exportscript handelt..

sorry für den überflüssigen thread..
 
  • falsch übertragen/eingetragen
  • falsch ausgelesen/in PHP verarbeitet
  • falsch gesendet
  • falsch dargestellt
Mindestens einer von obigen Punkten muss zutreffen.

Da bleibt dir nur Debugging übrig. Und das musst du selber machen; im Forum löst sich das "Problem" nicht.

Mit utf8_en/decode() kannst du leicht prüfen, an welcher Stelle, welche Schritte notwendig sind.

edit:
mit mysql_set_charset() funktioniert es jetzt.. ich hab zwar keine ahnung warum, aber das is mir jetzt auch ziemlich egal, [...]
Hier die Lösung:
[...] die datenbank hat als encoding UTF-8,[...]
Diese Aussage war eben falsch ;)
 
Zuletzt bearbeitet:
mit mysql_set_charset() funktioniert es jetzt.. ich hab zwar keine ahnung warum, aber das is mir jetzt auch ziemlich egal, da es sich sowieso nur um ein exportscript handelt..

sorry für den überflüssigen thread..
wenn du die "Datenbank" also die Tabellen auf UTF-8 stellst, sagst du damit MySQL, dass die Datenspeicherung mit UTF-8 stattfinden soll.
Die MySQL-Verbindung zwischen dem MySQL-Server und PHP hat aber nochmal eine eigene Zeichenkodierung, i.R. iso-8859-1.
Deshalb hat MySQL die UTF-8 Daten von der Platte gelesen, nach iso-8859-1 konvertiert und PHP gesendet, weil die MySQL-Verbindung so eingestellt war, deshalb konnte PHP nichts damit anfangen.

edit: Hier die Lösung: Diese Aussage war eben falsch ;)
nein, die Aussage war richtig. Die Speicherung der Daten in MySQL fand in UTF-8 statt, aber nicht die Übertragung (MySQL-Verbindungscharset)
 
bei dem exportscript habe ich die umlaute mit mysql_set_charset() hinbekommen.. das exportscript erzeugt mir einen query, den ich dann im phpmyadmin ausgeführt habe..

in dem script, das jetzt auf die datenbank zugreift kommt es jetzt wieder zu darstellungsfehlern mit den umlauten.. im phpmyadmin werden die umlaute richtig dargestellt.. wenn ich in meinem script noch mysqli_set_charset() hinzufüge, dann funktioniert es..

wenn ich den vom exportscript erzeugten query von einer vom script erzeugten verbindung ausführen lasse (also nicht den umweg über phpmyadmin gehe), dann funktioniert es im script, im phpmyadmin werden die umlaut aber so dargestellt: ää..

das gilt für alle umlaute, die über das script (bzw über Zend_Db.. ich verwende das Zend Framework) erzeugt werden..

ich habe auch rausgefunden, woran das liegt.. verbindungen zur datenbank haben den cahrset latin1, die datenbank selbst ist utf8.. (klingt komisch, aber phpmyadmin sagt dass die datenbank utf8 ist und mysqli_character_set_name($link) sagt latin1.. ich hoffe ich habe das richtig verstanden ;))..

wie kann ich einstellen, dass die verbindungen auch utf8 als standard haben? mir wäre es sehr recht, wenn das konfiguriert werden könnte.. finde es irgendwie unschön, wenn das erst zur laufzeit gemacht wird..

edit: ich hätte hier besser mal aktualisieren sollen.. dann hätte ich mir viel zeit gespart, wenn ich ice's beitrag früher gelesen hätte.. :D
falls ich hier immer schreibe, dass die datenbank den charset utf8 hat, das aber de facto falsch ist, da nur die tabellen einen charset haben bitte ich dies zu entschuldigen ;)
 
wie kann ich einstellen, dass die verbindungen auch utf8 als standard haben? mir wäre es sehr recht, wenn das konfiguriert werden könnte.. finde es irgendwie unschön, wenn das erst zur laufzeit gemacht wird..
es gibt da für Zend_Db nen Parameter dafür, frag mich nun aber nicht, wie der hieß :biggrin:
ansonsten muss die my.ini von MySQL geändert werde
 
bei Zend_Db kann man beim aufruf der factory einfach das charset angeben..
PHP:
		$db = Zend_Db::factory('Pdo_Mysql', array(
		                          'host' => 'localhost',
		                          'username' => 'root',
		                          'password' => '',
		                          'dbname' => 'db',
		                          'charset' => 'utf8'
		                       ));

dann wird in der adapter klasse mysqli_set_charset() aufgerufen.. (falls du das meinst.. falls nicht hab ich nix gesagt :D )

bevor ich jetzt in der my.ini oder sonstwo rumpfusche habe ich mich jetzt dazu entschieden, das doch über die factory bzw mysqli_set_charset() zu lösen.. bevor es dann wieder probleme auf dem produktivserver oder sonstwo gibt..
 
Hab da noch ein Problemchen bei dem ich mal wieder nicht weiterkomme.

Also...

Bei mir läuft alles auf utf8.

Metatag: charset=utf-8
mysql_set_charset('utf8')

Alle Tabellen und Spalten sind auf 'utf8_general_ci' eingestellt.
Bis jetzt funktioniert auch alles einwandfrei, die Umlaute werden richtig dargestellt usw. Nur bei dem Paragraphenzeichen stellt sich davor noch das Zeichen des FF wenn div. Zeichen nicht dargestellt werden können.

Sieht dann so aus: �§

Was könnte das sein, denn davor ist nur ein Leerzeichen.
 
Und die Probleme werden nicht weniger...

Ich hätte gern einmal erschiessen zum mitnehmen bitte... :ugly:

Wenn ich per Formular Daten in eine Tabelle eintragen lassen will, scheitert das Script bei den Umlauten.

Alles was nach den Umlauten kommt wird nicht mehr in die DB eingetragen, inkl. der Umlaute selbst.

*edit* das hier hat sich schon erledigt.
Hab 2 Templates. Eins für das Projekt und eins für den Adminaccount. Im Admin hatte ich vergessen im Template das charset anzugeben *schäm*.
Jetzt gehts.
 
Zuletzt bearbeitet:
klingt für mich danach als hättest du zwar die richtigen Charsets eingestellt, aber die PHP-Operationen arbeiten nicht damit ;)
Schau mal nach der mbstring-Bibiliothek, die normalen String-Funktionen machen UTF-8 kaputt.
 
Das passiert nur beim dem Paragraphenzeichen, und unabhängig davon ob davor ein Leerzeichen ist oder nicht.
Tastatur kaputt? :mrgreen:
Nimm doch mal Wireshark und guck dir an, was du auf die Webseite sendest. Ich tippe mal stark drauf, dass du schon falsche Daten vom Formular abschickst.

Die Chance, dass nur das Paragraphenzeichen von PHP demoliert wird, is nämlich schon nahe 0.
 
@greaseball: https://php.net/manual/de/book.mbstring.php
ich habe es gerade bei mir probiert.. das paragraphenzeichen wird korrekt übermittelt, gespeichert, ausgelesen und angezeigt.. ich verwende aber an der stelle auch keine string funktionen..

@ice:
habe mal nen bisschen zu den problemen der string funktionen mit utf8 recherchiert.. hört sich sehr madig an.. ich glaube ich werde doch wieder umsatteln.. vor allem wegen dem zend framework, bei dem ich die verwendeten funktionen nicht beeinflussen kann.. bevor ich hässliche encoding probleme riskiere setze ich wohl doch auf iso-8859-1
 
Ich habs.

Ich hatte eine Funktion geschrieben die mir div. Sonderzeichen und Umlaute in HTML umwandelt. Das ist auch beim dem Paragraphenzeichen passiert.
Nach der Umstellung auf utf-8 hat es da wohl Probleme gegeben.
Umwandlung für den Paragraphen rausgenommen und siehe da -> es funktioniert.