it-swarm.com.de

Wie werden UTF-8-Zeichen in phpMyAdmin angezeigt?

Ich habe meine Datenbank richtig auf UTF-8 eingestellt und arbeite mit einer Datenbank, die japanische Zeichen enthält. Wenn ich SELECT * aus der mysql-Befehlszeile wähle, sehe ich die japanischen Zeichen richtig. Wenn Daten aus der Datenbank abgerufen und auf einer Webseite angezeigt werden, sehe ich sie richtig.

Wenn Sie jedoch die Tabellendaten in phpMyAdmin anzeigen, sehe ich nur Mülltext. dh.

ç§ã¯æ— ¥ ¬œ¬æ– ™ ç ½ ½ ½ § ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

Wie kann ich phpMyAdmin dazu bringen, die Zeichen auf Japanisch anzuzeigen?

Die Zeichenkodierung auf der HTML-Seite ist auf UTF-8 festgelegt.

Bearbeiten:

Ich habe einen Export meiner Datenbank versucht und die .sql-Datei in geany geöffnet. Die Zeichen sind immer noch unleserlich, obwohl die Kodierung auf UTF-8 eingestellt ist. (Bei einem mysqldump der Datenbank werden jedoch auch unleserliche Zeichen angezeigt.).

Der Zeichensatz ist für die Datenbank und alle Tabellen korrekt festgelegt ('latin' ist nirgendwo in der Datei zu finden)

CREATE DATABASE `japanese` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Ich habe die Zeilen zu my.cnf hinzugefügt und mysql neu gestartet, aber es gibt keine Änderung. Ich verwende Zend Framework, um Daten in die Datenbank einzufügen.

Ich werde für diese Frage eine Belohnung eröffnen, da ich das wirklich herausfinden möchte.

55
Matt McCormick

Ich habe ein bisschen mehr gegoogelt und bin auf this page gestoßen

Der Befehl scheint nicht sinnvoll zu sein, aber ich habe es trotzdem versucht:

In der Datei /usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.php am Ende der Funktion PMA_DBI_connect() unmittelbar vor der return-Anweisung habe ich hinzugefügt:

mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;");
mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;");

Und es funktioniert! Ich sehe jetzt japanische Zeichen in phpMyAdmin. WTF? Warum funktioniert das?

14
Matt McCormick

Leider ist phpMyAdmin eine der ersten PHP-Anwendungen, die mit MySQL korrekt über Zeichensätze sprechen. Ihr Problem ist höchstwahrscheinlich darauf zurückzuführen, dass die Datenbank nicht die korrekten UTF-8-Zeichenfolgen an erster Stelle speichert.

Um die Zeichen in phpMyAdmin richtig anzuzeigen, müssen die Daten korrekt in der Datenbank gespeichert sein. Durch das Konvertieren der Datenbank in einen korrekten Zeichensatz werden Web-Apps jedoch häufig zerstört, ohne dass die von MySQL bereitgestellten Charset-Funktionen berücksichtigt werden.

Darf ich fragen: Ist MySQL> Version 4.1? Für welche Web-App dient die Datenbank? phpBB? Wurde die Datenbank von einer älteren Version der Web-App oder einer älteren Version von MySQL migriert?

Mein Vorschlag ist nicht an Bruder, wenn die von Ihnen verwendete Web-App zu alt ist und nicht unterstützt wird. Konvertieren Sie die Datenbank nur in echtes UTF-8, wenn Sie sicher sind, dass die Web-App sie richtig lesen kann.


Bearbeiten: 

Ihr MySQL ist> 4.1, das heißt, es ist Zeichensatz-bewusst. Wie lauten die Zeichensatz-Kollatierungseinstellungen für Ihre Datenbank? Ich bin mir ziemlich sicher, dass Sie latin1, den MySQL-Namen für ASCII, verwenden, um den UTF-8-Text in 'Bytes' in der Datenbank zu speichern.

Für Clients ohne Zeichensätze (d. H. Mysql-cli und php-mod-mysql) werden Zeichen korrekt angezeigt, da sie als Bytes in die Datenbank übertragen werden. In phpMyAdmin werden Bytes gelesen und als ASCII -Zeichen angezeigt. Dies ist der scheinbare Müll-Text.

Unzählige Stunden waren vor Jahren (2005?) Verbracht worden, als MySQL 4.0 in vielen Teilen Asiens veraltet war. Es gibt eine Standardmethode, um mit Ihrem Problem und verschlungenen Daten umzugehen:

  1. Sichern Sie Ihre Datenbank als .sql
  2. Öffnen Sie es im UTF-8-fähigen Texteditor. Stellen Sie sicher, dass sie richtig aussehen.
  3. Suchen Sie nach charset collation latin1_general_ci, ersetzen Sie latin1 durch utf8.
  4. Als neue SQL-Datei speichern, überschreiben Sie Ihre Sicherung nicht
  5. Importieren Sie die neue Datei, sie wird jetzt in phpMyAdmin richtig angezeigt und Japanisch in Ihrer Web-App wird zu Fragezeichen. Das ist normal.
  6. Fügen Sie für Ihre PHP-Web-App, die auf php-mod-mysql angewiesen ist, mysql_query("SET NAMES UTF8"); nach mysql_connect() ein. Jetzt sind die Fragezeichen weg.
  7. Fügen Sie die folgende Konfiguration my.ini für mysql-cli hinzu:

    # CLIENT SECTION
    [mysql]
    default-character-set=utf8
    # SERVER SECTION
    [mysqld]
    default-character-set=utf8
    

Weitere Informationen zum Zeichensatz in MySQL finden Sie im Handbuch: http://dev.mysql.com/doc/refman/5.0/de/charset-server.html

Ich nehme an, dass Ihre Web-App php-mod-mysql verwendet, um eine Verbindung zur Datenbank herzustellen (daher die Funktion mysql_connect()), da php-mod-mysql die einzige Erweiterung ist, von der ich mir vorstellen kann, dass sie das Problem noch heute anhält. 

phpMyAdmin verwendet php-mod-mysqli, um sich mit MySQL zu verbinden. Ich habe nie gelernt, wie man es benutzt, weil ich zu Frameworks wechsle *, um meine PHP-Projekte zu entwickeln. Ich möchte Sie ausdrücklich dazu auffordern.

  • Viele Frameworks, z. CodeIgniter, Zend, verwenden Sie mysqli oder pdo, um eine Verbindung zu Datenbanken herzustellen. Mod-MySQL-Funktionen gelten als veraltet, da dies zu Problemen bei der Leistung und Skalierbarkeit führt. Außerdem möchten Sie Ihr Projekt nicht an einen bestimmten Datenbanktyp binden.
35
timdream

Wenn Sie PDO verwenden, vergessen Sie nicht, es mit UTF8 zu initiieren:

 $con = new PDO('mysql:Host=' . $server . ';dbname=' . $db . ';charset=UTF8', $user, $pass,  array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

(Ich habe gerade 5 Stunden gebraucht, um das herauszufinden, hoffe, es wird jemandem wertvolle Zeit sparen ...) 

29
Naama Katiee

Ich hatte das gleiche Problem,

Setzen Sie alle Text/Varchar-Kollatierungen in phpMyAdmin auf utf-8.

mysql_set_charset ("utf8", $ Ihr_Verbindungsname); 

Das hat es für mich gelöst.

7
Dinaga

die Lösung dafür kann so einfach sein wie:

  1. fügen Sie diese hinzu, nachdem die Datenbank verbunden ist - function--
  2. add this after database is conncted $db_conect->set_charset('utf8');
5
ajreal

phpmyadmin folgt der MySQL-Verbindung nicht, da sie die korrekte Sortierung in der phpmyadmin-Konfigurationsdatei definiert.

Wenn wir also nicht wollen oder nicht auf Serverparameter zugreifen können, sollten wir einfach zwingen, Ergebnisse in einem anderen Format (Kodierung) zu senden, das mit dem Client kompatibel ist, d. H. Phpmyadmin

wenn zum Beispiel sowohl die MySQL-Verbindungssortierung als auch der MySQL-Zeichensatz utf8 sind, aber phpmyadmin ISO ist, sollten wir diese vor jeder Auswahlabfrage hinzufügen, die über phpmyadmin an MYSQL gesendet wird: 

SET SESSION CHARACTER_SET_RESULTS =latin1;
3
mazic roohi

Ändern Sie latin1_swedish_ci in utf8_general_ci in phpmyadmin-> tabellenname-> Feldname

Hier finden Sie es auf dem Bildschirm:

3
HaMid Ali

Auf folgende Weise kann ich die Daten ohne Lockerheit zwischen latin1 und utf8 wiederherstellen:

/**
     * Fixes the data in the database that was inserted into latin1 table using utf8 encoding.
     *
     * DO NOT execute "SET NAMES UTF8" after mysql_connect.
     * Your encoding should be the same as when you firstly inserted the data.
     * In my case I inserted all my utf8 data into LATIN1 tables.
     * The data in tables was like ДЕТСКИÐ.
     * But my page presented the data correctly, without "SET NAMES UTF8" query.
     * But phpmyadmin did not present it correctly.
     * So this is hack how to convert your data to the correct UTF8 format.
     * Execute this code just ONCE!
     * Don't forget to make backup first!
     */
    public function fixIncorrectUtf8DataInsertedByLatinEncoding() {
        // mysql_query("SET NAMES LATIN1") or die(mysql_error()); #uncomment this if you already set UTF8 names somewhere

        // get all tables in the database
        $tables = array();
        $query = mysql_query("SHOW TABLES");
        while ($t = mysql_fetch_row($query)) {
            $tables[] = $t[0];
        }
        // you need to set explicit tables if not all tables in your database are latin1 charset
        // $tables = array('mytable1', 'mytable2', 'mytable3'); # uncomment this if you want to set explicit tables

        // duplicate tables, and copy all data from the original tables to the new tables with correct encoding
        // the hack is that data retrieved in correct format using latin1 names and inserted again utf8
        foreach ($tables as $table)  {
            $temptable = $table . '_temp';
            mysql_query("CREATE TABLE $temptable LIKE $table") or die(mysql_error());
            mysql_query("ALTER TABLE $temptable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysql_error());
            $query = mysql_query("SELECT * FROM `$table`") or die(mysql_error());
            mysql_query("SET NAMES UTF8") or die(mysql_error());
            while ($row = mysql_fetch_row($query)) {
                $values = implode("', '", $row);
                mysql_query("INSERT INTO `$temptable` VALUES('$values')") or die(mysql_error());
            }
            mysql_query("SET NAMES LATIN1") or die(mysql_error());
        }

        // drop old tables and rename temporary tables
        // this actually should work, but it not, then
        // comment out this lines if this would not work for you and try to rename tables manually with phpmyadmin
        foreach ($tables as $table)  {
            $temptable = $table . '_temp';
            mysql_query("DROP TABLE `$table`") or die(mysql_error());
            mysql_query("ALTER TABLE `$temptable` RENAME `$table`") or die(mysql_error());
        }
        // now you data should be correct

        // change the database character set
        mysql_query("ALTER DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysql_error());

        // now you can use "SET NAMES UTF8" in your project and mysql will use corrected data
    }
3
pleerock

Zuerst vom Kunden tun

mysql> SHOW VARIABLES LIKE 'character_set%';

Dies wird Ihnen so etwas wie geben

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

hier können Sie die allgemeinen Einstellungen für den Client, die Verbindung und die Datenbank überprüfen

Dann sollten Sie auch die Spalten untersuchen, mit denen Sie Daten abrufen

SHOW CREATE TABLE TableName

und Überprüfen des Zeichensatzes und der Sortierung von CHAR-Feldern (obwohl die Leute diese normalerweise nicht explizit festlegen, aber es möglich ist, CHAR[(length)] [CHARACTER SET charset_name] [COLLATE collation_name] in CREATE TABLE foo ADD COLUMN foo CHAR ... zu geben)

Ich glaube, dass ich alle relevante Einstellungen auf der Seite von MySQL aufgelistet habe. Wenn ich mich immer noch verlaufen habe, lies gut docs und vielleicht auch dieses Frage , was etwas Licht ins Dunkel bringen könnte (vor allem, wie ich es richtig gemacht habe, indem ich mich im ersten Schritt nur mit dem MySQL-Client befasst habe) .

2
Unreason

1- Datei öffnen:

C:\wamp\bin\mysql\mysql5.5.24\my.ini

2- Suchen Sie nach dem Eintrag [mysqld] und hängen Sie ihn an:

character-set-server = utf8
skip-character-set-client-handshake

Die ganze Ansicht sollte aussehen :

[mysqld]
  port=3306
  character-set-server = utf8
  skip-character-set-client-handshake

3- Starten Sie den MySQL-Dienst neu!

2
magickey

Die Funktions- und Dateinamen stimmen nicht mit denen in neueren Versionen von phpMyAdmin überein. So beheben Sie die neueren PHPMyAdmins: 

  1. Datei suchen: phpmyadmin/libraries/DatabaseInterface.php

  2. In Funktion: public function query

  3. Gleich nach der Eröffnung { füge folgendes hinzu:

    if($link != null){
        mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;");
        mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;");
    }
    

Das ist es. Klappt wunderbar.

2
codemonkey

kommentieren Sie diese Zeilen in libraries/database_interface.lib.php einfach aus

if (! empty($GLOBALS['collation_connection'])) {
       // PMA_DBI_query("SET CHARACTER SET 'utf8';", $link, PMA_DBI_QUERY_STORE);
       //PMA_DBI_query("SET collation_connection = '" .
       //PMA_sqlAddslashes($GLOBALS['collation_connection']) . "';", $link, PMA_DBI_QUERY_STORE);
} else {
       //PMA_DBI_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci';", $link, PMA_DBI_QUERY_STORE);
 }

wenn Sie Daten in utf8 speichern, ohne den Zeichensatz zu speichern, benötigen Sie phpmyadmin nicht, um die Verbindung erneut zu konvertieren. Das wird funktionieren.

1
Evan Tedeschi

Ich hatte genau das gleiche Problem. Der Zeichensatz der Datenbank ist utf-8 und die Sortierung ist utf8_unicode_ci. In meiner Webapp konnte ich Unicode-Text sehen, aber die Ergebnisse von phpMyAdmin und sqldump waren fehlerhaft. 

Es stellte sich heraus, dass das Problem in der Art und Weise war, in der meine Webanwendung eine Verbindung zu MySQL herstellte. Mir fehlte die Codierungsflagge. 

Nachdem ich das Problem behoben hatte, konnte ich griechische Zeichen in phpMyAdmin und sqldump richtig sehen, aber verlor alle meine vorherigen Einträge .

1
thanassis

Es ist wirklich einfach, mehrsprachig in myphpadmin hinzuzufügen. Wenn Sie garbdata in myphpadmin angezeigt haben, gehen Sie zu myphpadmin. Klicken Sie auf Ihre Datenbank. ein einfacher und einfacher Trick

1
user3773240

ALTER TABLE table_name CONVERT in CHARACTER SET utf8;

* WICHTIG: Zuerst sichern, danach ausführen

0
Alex M

Hinzufügen: 

mysql_query("SET NAMES UTF8");

unten:

mysql_select_db(/*your_database_name*/);
0
Herlina Astari

Für mich geht das,

mysqli_query($con, "SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
0
Shyam

Einfachere Lösung für Wamp ist: Gehe zu phpMyAdmin, Klicken Sie auf localhost, Wählen Sie latin1_bin für die Sortierung der Serververbindung aus Starten Sie dann das Erstellen der Datenbank und der Tabelle

0
wma