utf-8 und DBD::mysql

09/11/2008 - 16:24 von Martin Kißner | Report spam
Hallo zusammen,

zum Thema utf-8 und DBD::mysql gibt es ja ne Menge Stoff im Internet.
Damit konnte ich mein aktuelles Problem auch lösen, aber ich bin mit der
Lösung nicht zufrieden und frage mich, ob das nicht einfacher geht.

Ausgangssituation:
Ich habe eine Datenbank, die standardmàßig mit utf-8 làuft.
Außerdem arbeite ich auf einem utf-8 Terminal.

Die Verbindung zur Datenbank baue ich wie folgt auf:

my $dbh = DBI->connect( "$cred1","$cred2","$cred3",
(mysql_enable_utf8 =>1 })
or die "Connection to database failed: $DBI::errstr";

Nachdem ich Datensàtze abgerufen und in Variablen bzw. arrays
gespeichert habe, muss ich für jedes Feld folgendes machen, damit sie
korrekt ausgegeben werden kann:

if (utf8::is_utf8($var[0])) {$var[0] = Encode::encode_utf8($var[0]);

Das empfinde ich als ausgesprochen umstàndlich.

binmode STDOUT, ':utf8';

kann ich nicht verwenden, da ich auch Daten ausgebe, die aus utf-8
kodierten Dateien kommen und diese Ausgaben dann zerbröselt werden.

Meine Frage:
Gibt es zwischenzeitlich eine einfachere Methode, utf-8 kodierte Daten
aus einer Datenbank auszulesen und korrekt auszugeben?

Freundlicher Gruß
Martin

PS: Mich wundert außerdem, dass ich "utf8::is_utf8('bla')" verwenden kann,
auch wenn ich nirgendwo ein "use utf8 irgendwas" verwendet habe.
ich benutze nur "use DBI" und "use Encode". Dennoch funktioniert es.
Vielleicht kann jemand erklàren, woran das liegt.

perl -e '$S=[[73,116,114,115,31,96],[108,109,114,102,99,112],
[29,77,98,111,105,29],[100,93,95,103,97,110]];
for(0..3){for$s(0..5){print(chr($S->[$_]->[$s]+$_+1))}}'
 

Lesen sie die antworten

#1 Slaven Rezic
09/11/2008 - 21:27 | Warnen spam
Martin Kißner writes:

Hallo zusammen,

zum Thema utf-8 und DBD::mysql gibt es ja ne Menge Stoff im Internet.
Damit konnte ich mein aktuelles Problem auch lösen, aber ich bin mit der
Lösung nicht zufrieden und frage mich, ob das nicht einfacher geht.

Ausgangssituation:
Ich habe eine Datenbank, die standardmàßig mit utf-8 làuft.
Außerdem arbeite ich auf einem utf-8 Terminal.

Die Verbindung zur Datenbank baue ich wie folgt auf:

my $dbh = DBI->connect( "$cred1","$cred2","$cred3",
(mysql_enable_utf8 =>1 })
or die "Connection to database failed: $DBI::errstr";

Nachdem ich Datensàtze abgerufen und in Variablen bzw. arrays
gespeichert habe, muss ich für jedes Feld folgendes machen, damit sie
korrekt ausgegeben werden kann:

if (utf8::is_utf8($var[0])) {$var[0] = Encode::encode_utf8($var[0]);

Das empfinde ich als ausgesprochen umstàndlich.

binmode STDOUT, ':utf8';

kann ich nicht verwenden, da ich auch Daten ausgebe, die aus utf-8
kodierten Dateien kommen und diese Ausgaben dann zerbröselt werden.

Meine Frage:
Gibt es zwischenzeitlich eine einfachere Methode, utf-8 kodierte Daten
aus einer Datenbank auszulesen und korrekt auszugeben?



Die Dokumentation erwàhnt mysql_enable_utf8. Verwendet habe ich dieses
Flag noch nicht.

ORM-Systeme haben oft auch die Möglichkeit, die utf8-Konvertierung
automatisch vorzunehmen. Bei DBIx::Class z.B. mit
DBIx::Class::UTF8Columns.

Gruß,
Slaven

Slaven Rezic - slaven <at> rezic <dot> de

sf-upload: make batch releases on SourceForge
http://sf-upload.sf.net

Ähnliche fragen