Warum sind die Umlaute bei der Verwendung von MySQL? kaputt?
Inhalt:
Seit der Version 804.xxx von Tk (das ist die Version, die beispielsweise bei den neuesten ActivePerl-Distributionen dabei ist) werden alle Tk-internen Variablen nach UTF-8 gewandelt. Seitdem muss man aufpassen, wenn diese Variablen in der "Außenwelt" (Ein-/Ausgabeoperationen auf Dateien, Datenbankoperation ...) verwendet werden sollen. Es ist nämlich notwendig, der "Außenwelt" mitzuteilen, in welchem Encoding die Daten zur Verfügung gestellt werden. Das wird mit dem Modul "Encode" bewerkstelligt. Wenn Daten von Tk in die "Außenwelt" gehen, muss mittels
Encode::encode($encoding, $tk_data) und für die Rückrichtung mittels
Encode::decode($encoding, $external_data) konvertiert werden.
Dieses gilt also auch, wenn Daten von Tk nach MySQL und zurück wandern. Und das Problem ist nicht auf MySQL beschränkt, sondern betrifft alle Datenbank-Treiber. Bei Postgres gibt es aber die Möglichkeit, die Umwandlung automatisch durchführen zu lassen (siehe Dokumentation zu DBD::pg).
Ein komplettes Beispiel:
#!/usr/bin/perl
# -*- perl -*-
use strict;
use warnings;
use Tk;
use DBI;
use Encode;
my $mw = tkinit;
my $dbh = DBI->connect("dbi:mysql:test", "test", "test") or die $DBI::error;
$dbh->do("drop table utf8") or die;
$dbh->do("create table utf8 (a varchar(256))") or die;
my $e;
$mw->Entry(-textvariable => \$e)->pack;
$mw->Button(-text => "In die DB schreiben",
-command => sub {
$dbh->do("delete from utf8");
$dbh->do("insert into utf8 values (?)", undef, encode("utf-8", $e));
})->pack;
$mw->Button(-text => "Aus der DB lesen",
-command => sub {
my $sth = $dbh->prepare("SELECT * from utf8");
$sth->execute or die $DBI::error;
my $row = $sth->fetchrow_hashref;
$e =decode("utf-8", $row->{a});
$sth->finish;
})->pack;
MainLoop;
__END__
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff