Thread für in der MySQL-Datenbank ...
(11 answers)
Opened by rtp_de at 2013-11-26 15:48
Bedenke das "UTF-8" und "perl-utf8" nicht das selbe sind. Perl behandelt binäre Scalare anders als "dekodierte". Ein dekodierter Scalar bekommt von Perl ein "utf8-Flag". Darum fragte ich, ob du mal mit Devel::Peek geschaut hast ob das Flag gesetzt ist.
Du ließt Binäre Daten aus LWP::UserAgent my $ticker=$response->content();, die du dann an XML::RSS übergibst, das daraus einen Hash-Baum macht, dessen Elemente wahrscheinlich auch Binäre UTF-8 Scalare sind. (prüfe das mal mit $ok=utf8::is_utf8($str) oder halt mit Devel::Peek). Die übergibst du dann an DBI. DBI erkennt das die Daten binär vorliegen (kein utf8-Flag) und versendet sie als latin1. Die MySQL will aber nur UTF-8 speichern und wandelt das vermeintliche latin1 in UTF-8, und du es kommt Daten-müll heraus. Ähnlich mag es gelaufen sein als du $dbh->{'mysql_enable_utf8'} benutzt hast. Da hat DBI das vermeintliche latin1 in UTF-8 gewandelt. Das von dir erwähnte $str=Encode::encode("ISO-8859-1",$str) funktioniert auch nicht wie erwartet, da die Daten schon binär sind (kein utf8-flag) wird nichts gewandelt. Wenn du vorher ein $str=Encode::decode("UTF-8",$str) gemacht hättest, wäre wahrscheinlich das erwartete heraus gekommen. Das ist erst mal eine Vermutung, die sich aber mit deinen Informationen deckt. Mein Vorschlag ist erst mal zu schauen ob das utf8-flag durchgängig gesetzt ist. Wenn nicht, encodiere die Scalare, die du an die DB sendest. Und wenn das nicht hilft setze 'mysql_enable_utf8'. Wenn das alles nicht funktioniert müssen wir weiter schauen. |