it-swarm.dev

Como exibir caracteres UTF-8 no phpMyAdmin?

Eu tenho meu banco de dados configurado corretamente para UTF-8 e estou lidando com um banco de dados contendo caracteres japoneses. Se eu fizer SELECT * ... a partir da linha de comando do mysql, eu vejo corretamente os caracteres japoneses. Ao extrair dados do banco de dados e exibi-los em uma página da Web, eu os vejo corretamente.

No entanto, ao visualizar os dados da tabela no phpMyAdmin, acabei de ver o texto de lixo. ie.

ç ã æ æ æ æ æ Œ Œ Œ Œ Œ Œ Œ Œ Œ Œ Œ ½ ã ã ã æ æ æ ... ... ... ... ... ... ... ... ... ... ... ...

Como posso obter o phpMyAdmin para exibir os caracteres em japonês?

A codificação de caracteres na página HTML está definida como UTF-8.

Editar:

Eu tentei uma exportação do meu banco de dados e abri o arquivo .sql em geany. Os caracteres ainda são ilegíveis, embora a codificação esteja definida como UTF-8. (No entanto, fazer um mysqldump do banco de dados também mostra caracteres ilegíveis).

O conjunto de caracteres está definido corretamente para o banco de dados e todas as tabelas ('latin' não é encontrado em nenhum lugar do arquivo)

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

Eu adicionei as linhas para my.cnf e reiniciei o mysql, mas não há mudança. Estou usando o Zend Framework para inserir dados no banco de dados.

Eu vou abrir uma recompensa por esta questão, porque eu realmente quero descobrir isso.

55
Matt McCormick

Eu fiz um pouco mais de googling e deparei com this page

O comando não parece fazer sentido, mas eu tentei mesmo assim:

No arquivo /usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.php no final da função PMA_DBI_connect() logo antes da instrução return eu adicionei:

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

E isso funciona! Agora vejo caracteres japoneses no phpMyAdmin. WTF Por que isso funciona?

14
Matt McCormick

Infelizmente, o phpMyAdmin é um dos primeiros aplicativos php que conversam com o MySQL sobre o charset corretamente. Seu problema é provavelmente devido ao fato de que o banco de dados não armazena as strings UTF-8 corretas no primeiro lugar.

Para exibir corretamente os caracteres corretamente no phpMyAdmin, os dados devem ser armazenados corretamente no banco de dados. No entanto, converter o banco de dados em charset correto geralmente quebra os aplicativos da web que não reconhecem o recurso relacionado ao charset fornecido pelo MySQL.

Posso perguntar: é o MySQL> versão 4.1? Qual aplicativo web é o banco de dados para? phpBB? O banco de dados foi migrado de uma versão mais antiga do aplicativo da Web ou de uma versão mais antiga do MySQL?

Minha sugestão não é para o irmão se o aplicativo da web que você está usando for muito antigo e não for compatível. Apenas converta o banco de dados em UTF-8 real se tiver certeza de que o aplicativo da Web pode lê-los corretamente.


Edit: 

Seu MySQL é> 4.1, isso significa que ele reconhece o charset. Quais são as configurações de agrupamento charset para seu banco de dados? Tenho certeza que você está usando latin1, que é o nome do MySQL para ASCII, para armazenar o texto UTF-8 em 'bytes', no banco de dados.

Para clientes insensitivos a charset (por exemplo, mysql-cli e php-mod-mysql), os caracteres são exibidos corretamente, uma vez que estão sendo transferidos para/do banco de dados como bytes. No phpMyAdmin, os bytes são lidos e exibidos como caracteres ASCII, esse é o texto sujo que você parece.

Incontáveis ​​horas foram gastas anos atrás (2005?) Quando o MySQL 4.0 ficou obsoleto, em muitas partes da Ásia. Existe uma maneira padrão de lidar com o seu problema e engolir dados:

  1. Faça backup de seu banco de dados como .sql
  2. Abra-o no editor de texto compatível com UTF-8, verifique se ele está correto.
  3. Procure charset collation latin1_general_ci, substitua latin1 por utf8.
  4. Salvar como um novo arquivo sql, não sobrescreva seu backup
  5. Importe o novo arquivo, eles agora serão exibidos corretamente no phpMyAdmin e o japonês no seu aplicativo da Web se tornará pontos de interrogação. Isso é normal.
  6. Para o seu aplicativo web php que depende do php-mod-mysql, insira mysql_query("SET NAMES UTF8"); após mysql_connect(), agora os pontos de interrogação serão eliminados.
  7. Adicione a seguinte configuração my.ini para mysql-cli:

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

Para mais informações sobre o charset no MySQL, consulte o manual: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html

Note que eu suponho que seu aplicativo da web esteja usando o php-mod-mysql para se conectar ao banco de dados (daí a função mysql_connect()), já que o php-mod-mysql é a única extensão que eu acho que ainda aciona o problema PARA ESTE DIA. 

o phpMyAdmin usa o php-mod-mysqli para conectar-se ao MySQL. Eu nunca aprendi a usá-lo porque mudo para frameworks * para desenvolver meus projetos PHP. Eu recomendo fortemente que você faça isso também.

  • Muitos frameworks, por ex. CodeIgniter, Zend, usa mysqli ou pdo para se conectar a bancos de dados. As funções mod-mysql são consideradas obsoletas, pois causam problemas de performance e escalabilidade. Além disso, você não deseja vincular seu projeto a um tipo específico de banco de dados.
35
timdream

Se você estiver usando o PDO, não se esqueça de iniciá-lo com o UTF8:

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

(apenas passei 5 horas para descobrir isso, espero que isso poupe tempo precioso para alguém ...) 

29
Naama Katiee

Eu tive o mesmo problema,

Defina todos os agrupamentos text/varchar no phpMyAdmin para utf-8 e em arquivos php adicione isto:

mysql_set_charset ("utf8", $ your_connection_name); 

Isso resolveu para mim.

7
Dinaga

a solução para isso pode ser tão fácil quanto:

  1. adicione isso depois que o banco de dados estiver conectado __function__
  2. add this after database is conncted $db_conect->set_charset('utf8');
5
ajreal

o phpmyadmin não segue a conexão do MySQL porque define o seu correto agrupamento no arquivo de configuração do phpmyadmin.

Portanto, se não quisermos ou não conseguirmos acessar os parâmetros do servidor, devemos forçá-lo a enviar os resultados em um formato diferente (codificação) compatível com o cliente, por exemplo, phpmyadmin

por exemplo, se o agrupamento de conexões do MySQL e o conjunto de caracteres do MySQL forem utf8, mas o phpmyadmin for ISO, devemos adicioná-lo apenas antes de qualquer consulta de seleção enviada ao MYSQL por meio do phpmyadmin: 

SET SESSION CHARACTER_SET_RESULTS =latin1;
3
mazic roohi

Mude latin1_swedish_ci para utf8_general_ci em phpmyadmin-> table_name-> field_name

É aqui que você o encontra na tela:

3
HaMid Ali

Aqui está o meu caminho, como faço para restaurar os dados sem folgas do latin1 para 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

Primeiro, do cliente

mysql> SHOW VARIABLES LIKE 'character_set%';

Isso lhe dará algo parecido

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

onde você pode inspecionar as configurações gerais para o cliente, conexão, banco de dados

Em seguida, você também deve inspecionar as colunas das quais você está recuperando dados com

SHOW CREATE TABLE TableName

e inspecionando o charset e o agrupamento de campos CHAR (embora geralmente as pessoas não os definam explicitamente, mas é possível dar CHAR[(length)] [CHARACTER SET charset_name] [COLLATE collation_name] em CREATE TABLE foo ADD COLUMN foo CHAR ...)

Eu acredito que eu listei all configurações relevantes no lado do mysql. Se ainda me perdendo, leio bem docs e talvez isso question que possa lançar alguma luz (especialmente como eu achei que estava certo olhando apenas para o cliente mysql na primeira vez).

2
Unreason

1- Abra o arquivo:

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

2- Procure a entrada [mysqld] e anexe:

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

Toda a visão deve ser parecida com :

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

3- Reinicie o serviço MySQL!

2
magickey

Os nomes de funções e arquivos não correspondem aos das versões mais recentes do phpMyAdmin. Aqui está como corrigir nos novos PHPMyAdmins: 

  1. Encontre o arquivo: phpmyadmin/libraries/DatabaseInterface.php

  2. Em funcionamento: public function query

  3. Logo após a abertura { adicione isto:

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

É isso aí. Funciona como um encanto.

2
codemonkey

apenas descomente esta linhas em 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);
 }

se você armazenar dados em utf8 sem armazenar o charset, não precisará do phpmyadmin para reconverter novamente a conexão. Isso vai funcionar.

1
Evan Tedeschi

Eu tive exatamente o mesmo problema. O conjunto de caracteres do banco de dados é utf-8 e o agrupamento é utf8_unicode_ci. Eu era capaz de ver o texto Unicode no meu webapp, mas os resultados phpMyAdmin e sqldump foram ilegíveis. 

Descobriu-se que o problema estava no modo meu aplicativo da web estava se conectando ao MySQL. Eu estava faltando a bandeira de codificação. 

Depois que eu consertei, pude ver caracteres gregos corretamente tanto no phpMyAdmin quanto no sqldump, mas perdi todas as minhas entradas anteriores .

1
thanassis

É muito simples para adicionar multilanguage em myphpadmin se você tem garbdata mostrando em myphpadmin, basta ir para myphpadmin clique em seu banco de dados vá para a aba operações na aba operação veja a seção collation configurá-lo para utf8_general_ci, depois disso todos os seus garbdata serão mostrados corretamente. um truque simples e fácil

1
user3773240

ALTER TABLE table_name CONVERT para CHARACTER SET utf8;

* IMPORTANTE: primeiro backup, execute após

0
Alex M

Adicionar: 

mysql_query("SET NAMES UTF8");

abaixo:

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

Funciona para mim,

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

A solução mais fácil para wamp é: Vá para phpMyAdmin, Clique em localhost, Selecione latin1_bin para o agrupamento de conexões do Servidor, E comece a criar banco de dados e tabela

0
wma