You are here: Wissensbasis Web>UtilFaqInclude>TkDBUnicode (2006-06-06)

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

UtilFaqSubForm edit

Titel Warum sind die Umlaute bei der Verwendung von MySQL? kaputt?
Autor
Bereich FaqTK
Topic revision: 2006-06-06, PlTk
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.