Moin!
Ich hab gelesen, dass ich die Daten am besten utf8-kodiert in meine DB speichern soll. (Hoffe das stimmt). Nun ist die Frage wie mach ich das am besten?
Die Verwendung von UTF-8 in allen Bereichen, in denen Zeichen vorkommen, ist definitiv eine sehr gute Idee. Ich kann da Alexanders unspezifizierte Kritik nicht nachvollziehen. Mit UTF-8 macht man sich das Leben sehr viel einfacher.
Meine html-Seite mit Formular hat den meta-tag:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Das reicht unter Umständen nicht allein aus, sollte dein Server einen anderslautenden HTTP-Header senden, würde dieser Vorrang haben. Aber es ist ein Anfang.
Mein Versuch im script:
$main::dbh->do("set character set utf8");
$main::dbh->do("set names utf8");
my $sql = qq{INSERT INTO x (uid) VALUES (?)};
my $sth = $main::dbh->prepare ($sql) || die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
$sth->execute($par_uid);
$sth->finish;
Sieht alles bestens aus.
Aber er speichert mir die Daten dennoch nicht utf-8 kodiert in der DB ab (das seh ich anhand der Darstellung im Browser bei phpmyadmin), sondern als normales öä (hmm vielleicht brauch ich mir da keinen Aufwand machen um das überhaupt zu kodieren, aber ich glaub das wäre eher unschön).
Was genau siehst du? PHPMyAdmin soll dir selbstverständlich Umlaute anzeigen, wenn Umlaute gespeichert sind. Diese "Ersatzdarstellung" mit A-Tilde-Knörks ist eine Fehldarstellung, wenn UTF-8-Bytes fälschlich als ISO-8859-1-Zeichen interpretiert werden. PHPMyAdmin macht diesen Fehler eben nicht.
Da die Datenbank aber ohnehin eine Blackbox ist und du nicht wirklich an die darin gespeicherten Bytes rankommst (wozu auch), beschränke deine Betrachtung doch einfach auf das, was sich innerhalb von Perl abspielt. Wenn dort die korrekten Bytes im String stecken, ist alles bestens.
Oder habt ihr mir vielleicht mal ein Beispiel, wie ihr allgemein bei dem Problem perl/dbi/mysql/"Sonderzeichen" in DB schreiben, auslesen und wieder als html darstellen?
Das schöne an UTF-8 ist, dass es sehr pflegeleicht handhabbar auch dort ist, wo "nur" ISO-8859-1-Speicherplatz zur Verfügung steht. Aber im Grunde mußt du nichts anders machen: Die Verbindung zur Datenbank hast du schon auf UTF-8-Codierung gesetzt (das ist der Hauptfehler sonst), die Meta-Elemente der HTML-Seiten existieren auch. Die Datenbank-Textfelder sollten ebenfalls auf UTF-8 mit passender Kollation (Sortiervorschrift) gesetzt werden, das falsch zu machen hat aber erstmal keine unmittelbar negativen Auswirkungen, sondern höchstens subtile, sollten Zeichen zu speichern sein, die mit der abweichenden Codierung nicht darstellbar sind.
- Sven Rautenberg
"Love your nation - respect the others."