Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Para usar utf8 ou não - problema de codificação de caracteres MySQL e PHP


Seu problema é que seu SET NAMES 'utf8_persian_ci' comando era inválido (utf8_persion_ci é um agrupamento , não uma codificação ). Se você executá-lo em um terminal, verá um erro Unknown character set: 'utf8_persian_ci' . Assim, seu aplicativo, quando armazenado os dados, estava usando o latin1 conjunto de caracteres. O MySQL interpretou sua entrada como caracteres latin1 que foram armazenados codificados como utf-8. Da mesma forma, quando os dados foram retirados, o MySQL os converteu de UTF-8 de volta para latin1 e (espero, na maioria das vezes) os bytes originais que você forneceu.

Em outras palavras, todos os seus dados no banco de dados estão completamente confusos, mas por acaso funcionou.

Para corrigir isso, você precisa desfazer o que fez. A maneira mais simples é usando PHP:
  1. SET NAMES latin1;
  2. Selecione todos os campos de texto de todas as tabelas.
  3. SET NAMES utf8;
  4. Atualize as mesmas linhas usando a mesma string inalterada.

Alternativamente, você pode executar essas etapas dentro do MySQL, mas é complicado porque o MySQL entende que os dados estão em um determinado conjunto de caracteres. Você precisa modificar suas colunas de texto para um tipo BLOB e modificá-las voltar para tipos de texto com um conjunto de caracteres utf8. Consulte a seção na parte inferior do ALTER TABLE Documentação do MySQL rotulada como "Aviso" em vermelho .

Depois de fazer qualquer uma dessas coisas, os bytes armazenados nas colunas do banco de dados serão o conjunto de caracteres real que afirmam ser. Então, certifique-se de usar sempre mysql_set_charset('utf8') em qualquer acesso de banco de dados do PHP que você possa fazer no futuro! Caso contrário, você vai estragar as coisas novamente. (Observe, não use um simples mysql_query('SET NAMES utf8') ! Existem casos de canto (como uma conexão de redefinição) em que isso pode ser redefinido para latin1 sem o seu conhecimento. mysql_set_charset() irá definir o charset sempre que necessário.)

Seria melhor se você mudasse de mysql_* funções e usado PDO em vez disso, com o charset=utf8 parâmetro em seu PDO dsn .