Acentuação no PHP e MYSQL com UTF-8

Olá,

A acentuação, ao gravar em banco de dados com linguagem php, é um problema que todos programadores já passaram um dia, como eu passei a algum tempo e tive que quebrar a cabeça para resolver. É muito chato quando se desenvolve uma aplicação que ao tentar gravar informações no banco de dados que contenham caracteres não usuais como a Ç chegam no banco como Ã§, isso é extremamente  irritante. Chega de sofrimento, vamos então aos passos da solução.

MYSQL

O banco de dados deve ser criado com COLLATE utf8_general_ci, que define o banco como sendo utf-8.

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

Se já tiver um banco, faça a alteração com o comando a seguir.

ALTER DATABASE `bancodedados` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

 

PHP

No seu script PHP de conexão com o banco de dados, você deve mudar o charset para UTF-8 e após a conexão mysql é preciso executar os comandos mysql para setar o charset.

header('Content-Type: text/html; charset=utf-8');
mysql_connect($servidor,$usuario,$senha);
mysql_select_db($database);
mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

HTML

Nas páginas onde serão exibidas as informações inclua a meta tag abaixo para definir a página como UTF-8.

<meta http-equiv="content-type" content="text/html;charset=utf-8" />

Outra observação importante é verificar com qual codificação de caracteres foi salvo o arquivo de codigo fonte. Por exemplo o editor Sublime salva os arquivos na codificação UTF-8, mas existem outros editores que podem estar salvando o arquivo com outra codificação. Para verificar qual a codificação do arquivo, eu geralmente uso o Notepad++, na barra de informações na parte inferior do aplicativo, exibe a codificação do arquivo.

notepad++

Se verificar que a codificação está diferente de UTF-8, basta ir no menu formatar e clicar na opção “Converter para UTF-8”.

Estas informações me ajudaram bastante e espero que ajudem a vocês também.

Comentem o que acharam e as suas dúvidas.

Até a próxima!

32 comentários em “Acentuação no PHP e MYSQL com UTF-8”

  1. Em tempo: você citou como editor o Notepad++, mas se me permite uma sugestão, eu uso o PSPad: não é necessário instalar e tem a vantagem de executar o script a partir dele.

  2. Ola, tudo bem?
    me tira uma duvida, se puder.
    Eu uso mediawiki e quando fiz o BD no mysql, selecionei utf8 general ci, esta utf8 general ci em todas tabelas e banco / conexao

    so que o problema é que para eu pesquisar no BANCO, fica ruim, no site esta tudo ok, acentuação e etc, mas no banco de dados, caracteres especiais… exemplo ou800 necessidade deu800 comunicau8c3a7u8c3a3o… como corrigir isso? :/

    1. Olá David, me parece que o sistema está enviando os dados para o banco em uma codificação diferente da que esta configurado banco. Não conheço esse sistema de wiki, mas recomendo que leia a documentação do mesmo e verifique qual a codificação que eles indicam para o banco de dados. Para suas pesquisa via Sql, tente converter o campo na condição da pesquisa por exemplo: WHERE CONVERT(column2 USING utf8) = “TESTE”.

  3. Bem no meu caso não ajudou. Mas eu descobri outras formas, mas na internet:
    =========================================
    // A função abaixo tira o acentos das palavras, não testei o “ç” e o ” ¨ ”
    //A função serve para pesquisa os dados do banco, quando vc não estar conseguindo resolver o problema dos acentos convertendo, mesmo tendo alterado o colletion do banco
    function tira_acento($str){
    $limpa = preg_replace( ‘/[`^~\'”]/’, null, iconv( ‘UTF-8’, ‘ASCII//TRANSLIT’, $str ) );
    return $limpa;
    }

    //Converte o carácter que dando o problema na pagina para o carácter correto
    $titulo=utf8_decode($_POST[‘titulo’])
    ==================================
    Abraço e a paz a todos.

  4. Estava com problema somente no momento de gravar as variáveis php no banco. Este trecho que você postou me ajudou:

    mysql_query(“SET NAMES ‘utf8′”);
    mysql_query(‘SET character_set_connection=utf8’);
    mysql_query(‘SET character_set_client=utf8’);
    mysql_query(‘SET character_set_results=utf8’);

    Muito Obrigado!

  5. Estava com esse problema. Embora ao desenvolver no servidor local não aparecesse, mas era carregar no remoto para ele surgir. Suas dicas resolveram. Daqui pra frente será meu padrão. Fico agradecido!

  6. Amigo, muito obrigado, ajudou muito.
    Realmente esse problema é extremamente chato!
    Se não fosse a torre de babel teríamos um padrão único. rsssss

  7. Rafael

    utilizei o bloco de notas… salvei os arquivos em UTF-8… só que o erro persiste meu caro…

    inclusive e o banco mysql também está collation utf8_general_ci…

    andei pesquisando no google e não encontrei soluções para o meu problema…

    mas continuo na luta!

    Agradeço de novo!

    Diogo Lessa

  8. Olá, muito bom seu tópico!

    Baseado nele que estou sentindo algumas dificuldades (charset=utf-8);
    Tô usando o Dreamweaver para criar uma página de blog em PHP, e no navegador estão aparecendo muitos erros como este:
    a quinta, � hora de resolver a parte pr�tica. Ap�s arrancar uma vit�ria heroica no gin�sio Ilhas Malvinas
    Criei um banco de dados MySql e o armazenamento deles é perfeito, mas quando vou exibir no navegador… aparece estes problemas com a acentuação!

    Testei as informações passadas nesse blog e não deram certas… agradeço qualquer ajuda!

    Um abraço!

    1. Diogo, provavelmente os arquivos que você criou no Dreamweaver não foram salvos no formato UTF-8.
      Voce pode converter todos os arquivos do seu projeto simplesmente abrindo os mesmos no bloco de notas do windows e clicando na opção ” arquivo” e em “salvar como” na parte inferior da tela a seguir tem o campo “codificação”, basta você selecionar a opção UTF-8. No Dreamweaver deve haver esta opção para configuração, mas como nao uso o Dreamweaver, nao sei dizer como fazer isso, mas nada que o Google não saiba. Faça o teste e me diga se conseguiu.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *