Thread UTF-8 in Verbindung mit mysql (12 answers)
Opened by xtomcatx at 2008-09-13 06:08

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ü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

View full thread UTF-8 in Verbindung mit mysql