Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12486[/thread]

UTF-8 in Verbindung mit mysql

Leser: 4


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
xtomcatx
 2008-09-13 06:08
#114585 #114585
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,
nachdem ich eigentlich der festen Überzeugung war, den Bogen bei Unicode rauszuhaben, wurde ich heute eines besseren belehrt.
Es ist mir nicht möglich, aus einer utf8-Tabelle etwas auszulesen und einzufügen, ohne dazwischen etwas am Zeichensatz zu pfuschen. Eine Umkodierung mittels Encode hatte ich auch nicht vor.

Hier mal mein Beispiel
Code: (dl )
1
2
3
4
5
6
7
CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(255) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `test` (`id`, `text`) VALUES
(1, 'Mühle, über phpmyadmin eingefügt');


Die Datei liegt in UTF8 ohne BOM vor:
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
49
50
51
52
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

use CGI;
use DBI;
use CGI::Carp qw( fatalsToBrowser );

my $cgi = CGI->new();
$cgi->charset("utf8");
print $cgi->header( -type => "text/plain", -charset => "UTF-8" );       
my $aRef; my $query = "REPLACE INTO test SET id = 2, text = ?;"; my $string = "Mühle";
my $dbi = DBI->connect( "DBI:mysql:test", "test", "test", { RaiseError => 1, mysql_enable_utf8 => 1 } ) or die( $! );

$dbi->do($query, undef, $string);
$aRef = $dbi->selectall_arrayref( "SELECT id, text FROM test ORDER BY id" );
print "\n\n\# erster Versuch mit NAMES auf Standard\n";
print "\# id $$_[0]: $$_[1]\n" foreach @$aRef ;
# erster Versuch mit NAMES auf Standard
# id 1: Mühle, über phpmyadmin eingefügt
# id 2: Mühle (phpmyadmin ebenfalls falsch)

$dbi->do("SET NAMES utf8");
$dbi->do($query, undef, $string);
$aRef = $dbi->selectall_arrayref( "SELECT id, text FROM test ORDER BY id" );
print "\n\n\# zweiter Versuch mit NAMES auf utf8\n";
print "\# id $$_[0]: $$_[1]\n" foreach @$aRef ;
# zweiter Versuch mit NAMES auf utf8
# id 1: Mühle, über phpmyadmin eingefügt
# id 2: Mühle (in phpmyadmin korrekt)

$dbi->do($query, undef, $string);
$dbi->do("SET NAMES latin1");
$aRef = $dbi->selectall_arrayref( "SELECT id, text FROM test ORDER BY id" );
print "\n\n\# dritter Versuch mit NAMES auf utf8 fürs einfügen und auf latin1 fürs auslesen\n";
print "\# id $$_[0]: $$_[1]\n" foreach @$aRef ;
# dritter Versuch mit NAMES auf utf8 fürs einfügen und auf latin1 fürs auslesen
# id 1: Mühle, über phpmyadmin eingefügt
# id 2: Mühle (in phpmyadmin auch korrekt)

$dbi->do($query, undef, $string);
$dbi->do("SET NAMES utf8");
$aRef = $dbi->selectall_arrayref( "SELECT id, text FROM test ORDER BY id" );
print "\n\n\# vierter Versuch mit NAMES auf latin1 fürs einfügen und auf utf8 fürs auslesen\n";
print "\# id $$_[0]: $$_[1]\n" foreach @$aRef ;
# vierter Versuch mit NAMES auf latin1 fürs einfügen und auf utf8 fürs auslesen
# id 1: Mühle, über phpmyadmin eingefügt
# id 2: MÃ&#131;¼hle (in phpmyadmin ebenfalls falsch)


Kann mir jemand sagen, wie ich mysql oder perl auf die Sprünge helfen kann, um diese Umschalterei zu vermeiden? Der Schalter mysql_enable_utf8 bringt überhaupt keine Änderung.

Viele Grüße
Martin
xtomcatx
 2008-09-13 15:01
#114588 #114588
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Sollte etwa das das Ergebnis all meiner Mühen sein?
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
#!/usr/bin/perl
use strict;
use warnings;
use encoding "utf8";

use CGI;
use DBI;
use CGI::Carp qw( fatalsToBrowser );

my $cgi = CGI->new();
print $cgi->header( -type => "text/plain", -charset => "UTF-8" );       
my $aRef; my $query = "REPLACE INTO test SET id = 2, text = ?;"; my $string = "Mühle";
my $dbi = DBI->connect( "DBI:mysql:test", "test", "test", { RaiseError => 1, mysql_enable_utf8 => 1 } ) or die( $! );
print "String: $string";
# String: ;Mühle

$dbi->do("SET NAMES utf8");
$dbi->do($query, undef, $string);
$aRef = $dbi->selectall_arrayref( "SELECT id, text FROM test ORDER BY id" );
print "\n\n\# zweiter Versuch mit encoding und NAMES auf utf8\n";
print "\# id $$_[0]: $$_[1]\n" foreach @$aRef ;
# zweiter Versuch mit encoding und NAMES auf utf8
# id 1: Mühle, über phpmyadmin eingefügt
# id 2: Mühle


Alle Testfälle haben bisher gepasst. Beinhaltet "use encoding 'utf8'" schon "use utf8"?

1. Nachtrag: Nein, tut es nicht. "use utf8" sorgt nur dafür, dass man z.B. Umlaute in Variablennamen verwenden kann. Ohne dieses Pragma ist es nicht möglich. Lasse ich dieses Pragma weg, funktioniert alles bestens, da ist es egal, ob "use encoding 'utf8'" verwendet wird oder nicht. Wenn "use utf8" allerdings verwendet werden soll, so muss scheinbar auch "use encoding 'utf8'" eingesetzt werden. Unter anderem scheint dieses die binmodes für STDERR/STDIN/STDOUT umzuschalten, aber irgendwas wird noch gemacht. Die Frage ist: was?

2. Nachtrag: Von "use encoding" wird meist abgeraten. Außerdem ist es nicht threadsafe. Was tun?
Struppi
 2008-09-13 16:06
#114594 #114594
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ich bin kein Fachmann was das angeht, hab selber erst wenig mit utf gemacht, aber bei meinen Test reichte diese Zeile völlig aus:
Code (perl): (dl )
$DBH->do("set names utf8");

Weder die Perl Datei an sich muss in utf-8 kodiert sein, noch muss ich irgendwas spezielles einbinden, lediglich die Daten (logisch) und die Kodierung für den Browser müssen in utf-8 vorliegen.

(übrigens, hab ich dafür jetzt eben mal 5 Minuten gegoogled)
xtomcatx
 2008-09-13 16:16
#114600 #114600
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Genau um dieses Statement geht es doch. In Zusammenhang mit "use utf8;" funktioniert es leider nicht mehr vollständig.
Struppi
 2008-09-13 17:14
#114604 #114604
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
auch das kann ich nicht nachvollziehen.
Gast Gast
 2008-09-13 20:10
#114610 #114610
Achtung Unteschid bei "utf8" und "UTF-8" in perl...
RalphFFM
 2008-09-13 20:20
#114611 #114611
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo Gast, hmm, worin besteht der Unterschied? Danke für Infos.
topeg
 2008-09-13 22:54
#114618 #114618
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich glaube "utf8" ist was perl eigenes, das in seiner Struktur so ist, dass es sich gut in die bisherigen perlinternas einfügen. "UTF-8" folgt dagegen der Spezifikation. Es könnte somit sein, dass die Binärkodierung von "utf8" nicht gleich "UTF8" ist.


Aber nichts genaues weiß ich nicht...
Gast Gast
 2008-09-14 20:39
#114644 #114644
Es bleibt dabei: Unicode ist ein Hurensohn. Warum muss man sich damit aufhalten, was wurde sich mit dem Mist gedacht?
Ich weiss noch damals, als ich viel mit automatisierter Exceltabellenbearbeitung zu tun hatte, um festzustellen, dass Perl seit einiger Zeit Datenmüll (utf8) statt normalen Daten speichert; habe damals alle utf8-uses weggelassen und viel mit utf8::downgrade und $obj->isutf8 gearbeitet.

Nur weil man damit ein paar exotische Sprachen mit darstellen kann. Die kaum einer braucht.
moritz
 2008-09-14 21:47
#114649 #114649
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-09-14 18:39:24--
Nur weil man damit ein paar exotische Sprachen mit darstellen kann. Die kaum einer braucht.


Du meinst etwas so exotisches wie ein Euro-Zeichen, das rein zufällig unser offiziellles Währungssymbol ist und nicht in Latin-1 auftaucht? Oder die exotischen Sprachen, die über die Hälfte der Weltbevölkerung sprechen?
*kopfschüttel*
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2008-09-13 06:08.