2012-10-31 26 views
12

Meine Datenbank (MySql) hat eine utf8_general Kollatierung. Ich greife auf Daten aus der Datenbank zu und zeige eine Webseite (in Perl entwickelt), die schwedische Zeichen (ä, å, ö) mit unterschiedlichen Zeichen zeigt. Ich habe in Mysql Datenbank eingecheckt, dort kann ich die Daten mit ä, å, ö Zeichen darin sehen. Es scheint, dass es beim Zugriff auf Daten ein Verschlüsselungsproblem gibt. Beim Verbinden mit der Datenbank wird folgender Code verwendet:utf8 Enconding in Perl und MySql

my($dbh) = DBI->connect($config{'dbDriver'},$config{'dbUser'},$config{'dbPass'}) or die "Kunde inte ansluta till $config{'dataSource'}: " . $DBI::errstr; 
$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do('set names utf8'); 

Jegliche Hilfe ist erwünscht!

Danke.

+0

"Es gibt ein Problem beim Zugriff auf diese Daten" ist keine angemessene Beschreibung des Problems. – ikegami

+0

Ich meine, es gibt ein Codierungsproblem beim Zugriff auf Daten. Ich habe meine Frage auch aktualisiert. – dotnetrocks

+0

Wie genau zeigt es die Charaktere? Welche Codierung ist Ihre Webseite? –

Antwort

6

Wenn jeder A/A/ö wird durch zwei Bytes in der Ausgabe dargestellt wird, dann ist es auch möglich, dass Sie einen Doppelklick Codierung sein kann die Charaktere. (Angesichts der Tatsache, dass die Frage bereits zeigt $dbh->{'mysql_enable_utf8'} = 1;, vermute ich, dass dies der wahrscheinlichste Fall ist.) Eine andere Möglichkeit, da Sie dies auf einer Webseite anzeigen, ist, dass die Seite möglicherweise nicht angibt, dass der Zeichensatz UTF ist -8 in seiner und der Browser könnte falsch auf die Zeichencodierung erraten verwendet wird.

Sehen Sie sich Ihr Webapp-Framework, Templating-System usw. genau an, um sicherzustellen, dass die Werte nur einmal zwischen dem Abruf aus der Datenbank und dem Erreichen des Browsers des Benutzers codiert werden. Viele Frameworks/Template-Engines (wie die Kombination von Dancer und TT, die ich normalerweise verwende) werden die Ausgabecodierung automatisch handhaben, wenn Sie sie richtig konfigurieren, was bedeutet, dass die Daten doppelt codiert werden, wenn sie vor der Ausgabe explizit codiert werden. Hier

+1

Ich habe zweimal codiert. Ich habe es entfernt und arbeite jetzt !! Danke vielmals !! :) – dotnetrocks

0

Sie müssen Charset zu utf8 in Ihrer Verbindung setzen!

charset = utf8 
6

Sie müssen mysql_enable_utf8 auf Verbindung setzen:

my($dbh) = DBI->connect(
    'dbi:mysql:test', 
    'user', 
    'password', 
    { 
     mysql_enable_utf8 => 1, 
    }  
); 
+0

Hallo, danke. Ich habe versucht, mysql_enable_utf8 => 1, aber es Problem nicht gelöst. – dotnetrocks

+0

@dotnetrocks: Es löste das Problem, das Sie in Ihrer Frage angegeben haben. Wenn Sie Probleme mit der Codierung auf Webseiten hatten, sollten Sie auf IO und richtige Header achten. –

0

ist die complet spec:

http://search.cpan.org/~capttofu/DBD-mysql-4.038/lib/DBD/mysql.pm#mysql_enable_utf8

Zusätzlich zu dieser Flagge Drehen sagt MySQL, dass eingehende Daten sollten als UTF-8 behandelt werden. Dies wird nur wirksam, wenn Sie als Teil des Verbindungsaufrufs() verwendet werden. Wenn Sie das Flag nach dem Verbinden einschalten, müssen Sie den Befehl SET NAMES utf8 eingeben, um den gleichen -Effekt zu erhalten.