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:
SET NAMES latin1;
- Selecione todos os campos de texto de todas as tabelas.
SET NAMES utf8;
- 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
.