Thread Perl speichert nicht als UTF-8 in MySQL DB (5 answers)
Opened by roooot at 2009-05-17 21:12

sid burn
 2009-05-19 15:21
#121692 #121692
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hier mal ein komplettes funktionierendes Beispiel:

datenbank:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
mysql> show create table data;
+-------+-----------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------+
| data | CREATE TABLE `data` (
`id` int(11) NOT NULL auto_increment,
`key` varchar(255) default NULL,
`value` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------+
1 row in set (0.00 sec)


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
2
3
4
sidburn@sid:~/perl$ ./db.pl 
id: 1 key: näme value: dävid
id: 2 key: wörld value: föö
id: 3 key: möp value: müps


Daten in MySQL:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM data;
+----+--------+--------+
| id | key | value |
+----+--------+--------+
| 1 | näme | dävid |
| 2 | wörld | föö |
| 3 | möp | müps |
+----+--------+--------+
3 rows in set (0.00 sec)


"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

View full thread Perl speichert nicht als UTF-8 in MySQL DB