web-dev-qa-db-fra.com

Comment afficher les caractères UTF-8 dans phpMyAdmin?

Ma base de données est correctement définie sur UTF-8 et je traite avec une base de données contenant des caractères japonais. Si je sélectionne * ... depuis la ligne de commande mysql, je vois correctement les caractères japonais. Lorsque je extrait des données de la base de données et les affiche sur une page Web, je les vois correctement.

Cependant, lors de l'affichage des données de la table dans phpMyAdmin, je ne vois que du texte corrompu. c'est à dire.

ç§ã¯æ— ¥ æœ¬æ– ™ ç † ãŒå ¥ ½ãã§ã ™ ã € ‚æ— ¥ æœ¬æ– ™ ç † ã‚ ...

Comment puis-je obtenir que phpMyAdmin affiche les caractères en japonais?

Le codage des caractères sur la page HTML est défini sur UTF-8.

Modifier:

J'ai essayé d'exporter ma base de données et j'ai ouvert le fichier .sql dans geany. Les caractères sont toujours tronqués même si le codage est défini sur UTF-8. (Cependant, faire un mysqldump de la base de données montre également des caractères tronqués).

Le jeu de caractères est défini correctement pour la base de données et toutes les tables ('latin' ne se trouve nulle part dans le fichier)

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

J'ai ajouté les lignes à my.cnf et redémarré mysql mais il n'y a pas de changement. J'utilise Zend Framework pour insérer des données dans la base de données.

Je vais ouvrir une prime pour cette question car je veux vraiment comprendre cela.

55
Matt McCormick

J'ai fait un peu plus de recherches sur Google et je suis tombé sur this page

La commande ne semble pas avoir de sens mais je l’ai essayé quand même:

Dans le fichier /usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.php à la fin de la fonction PMA_DBI_connect() juste avant l'instruction return, j'ai ajouté:

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

Et il fonctionne! Je vois maintenant des caractères japonais dans phpMyAdmin. WTF? Pourquoi ça marche?

14
Matt McCormick

Malheureusement, phpMyAdmin est l’une des premières applications php à parler correctement de charset à MySQL. Votre problème est probablement dû au fait que la base de données ne stocke pas les chaînes UTF-8 correctes en premier lieu.

Afin d'afficher correctement les caractères dans phpMyAdmin, les données doivent être correctement stockées dans la base de données. Cependant, convertir la base de données en jeu de caractères approprié interrompt souvent les applications Web qui ne reconnaissent pas la fonctionnalité liée aux jeux de caractères fournie par MySQL.

Puis-je demander: est-ce que MySQL> version 4.1? À quelle application Web la base de données est-elle destinée? phpBB? La base de données a-t-elle été migrée à partir d'une version plus ancienne de l'application Web ou d'une version plus ancienne de MySQL?

Ma suggestion est de ne pas utiliser frère si l'application Web que vous utilisez est trop ancienne et n'est pas prise en charge. Convertissez uniquement la base de données en véritable UTF-8 si vous êtes certain que l'application Web peut les lire correctement.


Modifier: 

Votre MySQL est> 4.1, cela signifie qu'il est sensible aux jeux de caractères. Quels sont les paramètres de classement de charset pour votre base de données? Je suis presque sûr que vous utilisez latin1, qui est le nom MySQL pour ASCII, pour stocker le texte UTF-8 sous forme d'octets dans la base de données.

Pour les clients insensibles aux jeux de caractères (à savoir, mysql-cli et php-mod-mysql), les caractères sont affichés correctement car ils sont transférés vers/depuis la base de données sous forme d'octets. Dans phpMyAdmin, les octets sont lus et affichés sous forme de caractères ASCII, c'est le texte compliqué que vous semblez avoir.

De nombreuses heures avaient été passées il y a des années (2005?) Lorsque MySQL 4.0 est devenu obsolète, dans de nombreuses régions d'Asie. Il existe un moyen standard de traiter votre problème et les données englouties:

  1. Sauvegardez votre base de données en tant que .sql
  2. Ouvrez-le dans un éditeur de texte compatible UTF-8, assurez-vous qu'il a l'air correct.
  3. Recherchez charset collation latin1_general_ci, remplacez latin1 par utf8.
  4. Enregistrer sous un nouveau fichier SQL, ne pas écraser votre sauvegarde
  5. Importez le nouveau fichier. Ils apparaîtront correctement dans phpMyAdmin et le japonais sur votre application Web deviendra un point d'interrogation. C'est normal.
  6. Pour votre application web php qui s'appuie sur php-mod-mysql, insérez mysql_query("SET NAMES UTF8"); après mysql_connect(), les points d'interrogation disparaîtront.
  7. Ajoutez la configuration my.ini suivante pour mysql-cli:

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

Pour plus d'informations sur charset sur MySQL, reportez-vous au manuel: http://dev.mysql.com/doc/refman/5.0/fr/charset-server.html

Notez que je suppose que votre application Web utilise php-mod-mysql pour se connecter à la base de données (d'où la fonction mysql_connect()), puisque php-mod-mysql est la seule extension à laquelle je puisse penser qui continue de poser le problème TOUT CE JOUR. 

phpMyAdmin utilise php-mod-mysqli pour se connecter à MySQL. Je n'ai jamais appris à l'utiliser car je suis passé à des frameworks * pour développer mes projets php. Je vous encourage fortement à le faire aussi.

  • De nombreux cadres, par exemple CodeIgniter, Zend, utilisez mysqli ou pdo pour vous connecter aux bases de données. Les fonctions mod-mysql sont considérées comme obsolètes, ce qui pose un problème de performances et d’évolutivité. En outre, vous ne souhaitez pas lier votre projet à un type de base de données spécifique.
35
timdream

Si vous utilisez PDO, n'oubliez pas de l'initier avec UTF8:

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

(Je viens de passer 5 heures à comprendre cela, espérons que cela fera gagner un temps précieux à quelqu'un ...) 

29
Naama Katiee

J'ai eu le même problème,

Définissez tous les classements text/varchar dans phpMyAdmin sur utf-8 et dans les fichiers php, ajoutez ceci:

mysql_set_charset ("utf8", $ votre_nom_connection); 

Cela a résolu le problème pour moi.

7
Dinaga

la solution à cela peut être aussi simple que:

  1. trouver la fonction/méthode de connexion phpmysqladmin
  2. ajoute ceci après que la base de données soit connectée $db_conect->set_charset('utf8');
5
ajreal

phpmyadmin ne suit pas la connexion MySQL car il définit le classement approprié dans le fichier de configuration phpmyadmin.

Donc, si nous ne voulons pas ou si nous ne pouvons pas accéder aux paramètres du serveur, nous devrions simplement le forcer à envoyer les résultats dans un format (encodage) différent, compatible avec le client, par exemple phpmyadmin.

par exemple, si le classement de la connexion MySQL et le jeu de caractères MySQL sont au format utf8 mais que phpmyadmin est au format ISO, nous devrions simplement ajouter celui-ci avant toute requête de sélection envoyée au serveur MySQL via phpmyadmin: 

SET SESSION CHARACTER_SET_RESULTS =latin1;
3
mazic roohi

Changez latin1_swedish_ci en utf8_general_ci dans phpmyadmin-> nom_table-> nom_zone

C'est ici que vous le trouvez à l'écran:

3
HaMid Ali

Voici comment je peux restaurer les données sans relâchement de latin1 à utf8

/**
     * 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

Tout d'abord, du client faire

mysql> SHOW VARIABLES LIKE 'character_set%';

Cela vous donnera quelque chose comme

+--------------------------+----------------------------+
| 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/ | 
+--------------------------+----------------------------+

où vous pouvez inspecter les paramètres généraux du client, de la connexion, de la base de données

Ensuite, vous devriez également inspecter les colonnes à partir desquelles vous récupérez des données avec

SHOW CREATE TABLE TableName

et inspecter le jeu de caractères et l'assemblage des champs CHAR (bien que généralement les gens ne les définissent pas explicitement, mais il est possible de donner CHAR[(length)] [CHARACTER SET charset_name] [COLLATE collation_name] dans CREATE TABLE foo ADD COLUMN foo CHAR ...)

Je crois que j’ai répertorié tous les paramètres appropriés du côté de mysql . Si je me perds toujours, lisez très bien docs et peut-être cette question qui pourrait éclairer bien que je l’ai bien compris en ne regardant que le client mysql du premier coup).

2
Unreason

1- Ouvrir le fichier:

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

2- Recherchez l'entrée [mysqld] et ajoutez:

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

L'ensemble de la vue doit ressembler à :

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

3- Redémarrez le service MySQL!

2
magickey

Les noms de fonction et de fichier ne correspondent pas à ceux des nouvelles versions de phpMyAdmin. Voici comment corriger les nouveaux PHPMyAdmins: 

  1. Trouver le fichier: phpmyadmin/libraries/DatabaseInterface.php

  2. En fonction: public function query

  3. Juste après l'ouverture {, ajoutez ceci:

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

C'est tout. Fonctionne comme un charme.

2
codemonkey

décommentez simplement ces lignes dans libraries/database_interface.lib.php

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);
 }

si vous stockez des données dans utf8 sans stocker charset, vous n'avez pas besoin de phpmyadmin pour reconvertir la connexion. Cela fonctionnera.

1
Evan Tedeschi

J'ai eu exactement le même problème. Le jeu de caractères de la base de données est utf-8 et le classement utf8_unicode_ci. J'ai pu voir du texte Unicode dans mon application Web, mais les résultats de phpMyAdmin et de sqldump ont été déformés. 

Il s’est avéré que le problème était lié à la manière dont mon application Web se connectait à MySQL. Il me manquait l'indicateur de codage. 

Après l'avoir corrigé, j'ai pu voir les caractères grecs correctement dans phpMyAdmin et sqldump mais j'ai perdu toutes mes entrées précédentes .

1
thanassis

Il est très simple d’ajouter plusieurs langues dans myphpadmin si vous avez une indication de Garbdata dans myphpadmin, il suffit d’aller dans myphpadmin, de cliquer sur votre base de données dans l’onglet Opérations de la page de l’onglet Opération, voir la section de classement définie sur utf8_general_ci. un truc simple et facile

1
user3773240

ALTER TABLE table_name CONVERT to CHARACTER SET utf8;

* IMPORTANT: Sauvegardez d’abord, exécutez après

0
Alex M

Ajouter: 

mysql_query("SET NAMES UTF8");

au dessous de:

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

Ça marche pour moi,

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

La solution la plus simple pour wamp est la suivante: allez sur phpMyAdmin, cliquez sur localhost, sélectionnez latin1_bin pour le classement de la connexion au serveur, puis commencez à créer la base de données et la table

0
wma