Costumo ver algo semelhante a isso abaixo em scripts PHP usando MySQL
query("SET NAMES utf8");
Eu nunca tive que fazer isso para nenhum projeto ainda, então tenho algumas perguntas básicas sobre isso.
- Isso é algo que é feito apenas com o PDO?
- Se não for uma coisa específica do PDO, qual é o propósito de fazê-lo? Sei que está definindo a codificação para mysql, mas quero dizer, eu nunca tive que usá-lo, então por que eu iria querer usá-lo?
Respostas:
É necessário sempre que você deseja enviar dados ao servidor com caracteres que não podem ser representados em ASCII puro, como 'ñ' ou 'ö'.
Isso se a instância do MySQL não estiver configurada para esperar a codificação UTF-8 por padrão das conexões do cliente (muitas estão, dependendo de sua localização e plataforma).
Leia http://www.joelonsoftware.com/articles/Unicode.html caso você não saiba como o Unicode funciona.
Leia Se deve usar "SET NAMES" para ver as alternativas de SET NAMES e do que exatamente se trata.
fonte
SET NAMES UTF8
para eles?SELECT
instrução.Do manual :
Mais elaboradamente (e mais uma vez, retirado gratuitamente do manual ):
fonte
Acertar a codificação é realmente complicado - existem muitas camadas:
O comando SQL "SET CHARSET utf8" do PHP irá garantir que o lado do cliente (PHP) irá obter os dados em utf8, não importa como eles estão armazenados no banco de dados. Claro, eles precisam ser armazenados corretamente primeiro.
Definição DDL vs. dados reais
A codificação definida para uma tabela / coluna não significa realmente que os dados estão nessa codificação. Se por acaso você tiver uma tabela definida como,
utf8
mas armazenada com codificação diferente, o MySQL irá tratá-la comoutf8
e você terá problemas. O que significa que você tem que consertar isso primeiro.O que verificar
Você precisa verificar em qual codificação o fluxo de dados em cada camada.
Certifique-se de que haja o correto em todos os lugares.
Conversão
Se você receber dados, por exemplo
windows-1250
, e quiser armazenarutf-8
, use este SQL antes de armazenar:Se você tem dados no banco de dados
windows-1250
e deseja recuperá-losutf8
, use:Mais algumas notas:
fonte
Esta consulta deve ser escrita antes da consulta que cria ou atualiza os dados no banco de dados, esta consulta se parece com:
Observe que você deve escrever a codificação que está usando no cabeçalho, por exemplo, se estiver usando utf-8 e adicioná-la assim no cabeçalho ou isso causará um problema com o Internet Explorer
então sua página se parece com esta
fonte
A solução é
fonte
Em vez de fazer isso por meio de uma consulta SQL, use a função php: mysqli :: set_charset mysqli_set_charset
de http://www.php.net/manual/en/mysqli.set-charset.php
fonte
Obrigado @todos!
não use: query ("SET NAMES utf8"); isso é coisa de configuração e não uma consulta. coloque-o imediatamente após o início da conexão com setCharset () (ou método semelhante)
alguma coisinha em parctice:
status:
Armazenar e ler dados não é problema, desde que o mysql possa lidar com os caracteres. se você olhar no banco de dados, verá que há porcaria nele (por exemplo, usando phpmyadmin).
até agora isso não é problema! (errado, mas funciona com frequência (na Europa)) ..
..a menos que outro cliente / programa ou uma biblioteca alterada, que funcione corretamente, irá ler / salvar os dados. então você está em apuros!
fonte
Não apenas PDO. Se sql responder como '????' símbolos, preset de seu charset (espero UTF-8) realmente recomendado:
ou via estilo de procedimento
mysqli_set_charset($db,"utf8")
fonte