Referência: https://stackoverflow.com/a/8690422/784637
Corrija-me se estiver errado, mas a melhor resposta sugere uma maneira de forçar tudo que está sendo inserido no banco de dados a ser codificado em utf-8 e tudo que sai do banco de dados a ser codificado em utf-8.
Qual é a diferença entre os dois seguintes:
[client]
default-character-set=utf8
[mysqld]
default-character-set = utf8
A diretiva [mysqld]
força todas as gravações no banco de dados a serem codificadas em um determinado formato e a diretiva [client]
força toda a saída a ser codificada em um determinado formato?
Por exemplo, se as duas diretivas a seguir forem definidas:
[client]
default-character-set=utf8
[mysqld]
default-character-set = utf8
e há uma string php $var
codificada em latin1, se essa string for inserida no banco de dados, ela será armazenada no banco de dados como utf-8. Mas se uma instrução select for executada para recuperar esse valor, ela será codificada em latin1.
Esta opção pode forçar os programas clientes a usar um conjunto de caracteres específico. Isso normalmente é desnecessário. No entanto, quando character_set_system difere de character_set_server ou character_set_client e você insere caracteres manualmente (como identificadores de objeto de banco de dados, valores de coluna ou ambos), eles podem ser exibidos incorretamente na saída do cliente ou a própria saída pode ser formatada incorretamente. Nesses casos, iniciar o cliente mysql com --default-character-set=system_character_set - ou seja, definir o conjunto de caracteres do cliente para corresponder ao conjunto de caracteres do sistema - deve corrigir o problema.
MySQL Server tem um conjunto de caracteres de servidor e um agrupamento de servidor. Eles podem ser definidos na inicialização do servidor na linha de comando ou em um arquivo de opções e alterados no tempo de execução. O conjunto de caracteres do servidor e a ordenação são usados como valores padrão se o conjunto de caracteres do banco de dados e a ordenação não forem especificados nas instruções CREATE DATABASE. Eles não têm outro propósito.
Conclusão: A configuração do cliente está no nível da sessão sempre que o cliente se conecta ao servidor, o servidor força os clientes a usar um conjunto de caracteres específico, mas isso não é necessário. O conjunto de caracteres da seção Mysqld indica que o servidor está configurado para usar um determinado conjunto de caracteres por padrão, no entanto, você pode alterar o conjunto de caracteres em qualquer nível
Database
e nívelTable
queColumn
desejar.