Thread Perl speichert nicht als UTF-8 in MySQL DB
(5 answers)
Opened by roooot at 2009-05-17 21:12
Hier mal ein komplettes funktionierendes Beispiel:
datenbank: Code: (dl
)
1 mysql> show create table data; Die Datenbank ist noch leer. Mein Perl Code: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #!/usr/bin/env perl # Core Modules use strict; use warnings; use utf8; use open ':encoding(UTF-8)'; use open ':std'; # CPAN Modules use DBI; # Options my $host = 'localhost'; my $database = 'test'; my $user = 'root'; my $passwd = ''; my $options = { RaiseError => 1, AutoCommit => 1, mysql_enable_utf8 => 1 }; my $dsn = "dbi:mysql:database=$database"; # connect to database my $dbh = DBI->connect($dsn, $user, $passwd, $options); # insert statement my $insert_sql = q{ INSERT INTO data SET `key` = ?, `value` = ? }; my $insert = $dbh->prepare($insert_sql); # read all statement my $select_sql = q{ SELECT `id`, `key`, `value` FROM data }; my $select = $dbh->prepare($select_sql); # input some data $insert->execute('näme', 'dävid'); $insert->execute('wörld', 'föö'); $insert->execute('möp', 'müps'); # print all inserted $select->execute(); while ( my $data = $select->fetchrow_arrayref() ) { printf "id: %d key: %s value: %s\n", @$data; } Und wenn ich das ganze ausführe: Code: (dl
)
1 sidburn@sid:~/perl$ ./db.pl Daten in MySQL: Code: (dl
)
1 mysql> SET NAMES utf8; "SET NAMES utf8" wird benötigt weil die verbindung mit dem Tool "mysql" default ISO-8859-1 eingestellt ist, und er anfängt zu konvertieren bei den SELECT. Mit "SET NAMES utf8" sagt man ihm das die Verbindung selber auch "utf8" daten sein sollen. Das Terminal selber von mir ist natürlich auch auf "UTF-8" eingestellt. Ansonsten wo bekommst du die Ausgabe "Täststring" den genau? Den wenn man das hier anschaut dann hast du anscheind schon UTF-8 den das "ä" wurde zu zwei bytes, du hast es anscheind nur doppelt decodiert. Also obwohl es UTF-8 war, hast du es nochmal nach UTF-8 gewandelt. Oder doppelt encodiert etc. Du machst also an einer Stelle zu viel. Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
|