Mix ilegal de agrupamentos MySQL Error

Estou recebendo este erro estranho durante o processamento de um grande número de dados …

Error Number: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€' 

O que posso fazer para resolver isso? Posso escaping da string de alguma forma para que esse erro não ocorra, ou eu preciso alterar a codificação da minha tabela de alguma forma e, em caso afirmativo, como devo alterá-la?

 SET collation_connection = 'utf8_general_ci'; 

então para seus bancos de dados

 ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

O MySQL espreita sueco lá às vezes sem nenhuma razão sensata.

Você deve definir tanto a codificação de sua tabela quanto a codificação de conexão para UTF-8 :

 ALTER TABLE keywords CHARACTER SET UTF8; -- run once 

e

 SET NAMES 'UTF8'; SET CHARACTER SET 'UTF8'; 

Use a seguinte declaração para erro

Tenha cuidado com seus dados, faça backup se os dados estiverem na tabela.

  ALTER TABLE your_table_name CONVERTE PARA PERSONAGENS SET utf8 COLLATE utf8_general_ci; 
 CONVERT(column1 USING utf8) 

Resolve meu problema. Onde column1 é a coluna que me dá esse erro.

Em geral, a melhor maneira é alterar o agrupamento de tabelas. No entanto, eu tenho um aplicativo antigo e não é realmente capaz de estimar o resultado se isso tem efeitos colaterais. Por isso, tentei de alguma forma converter a string em algum outro formato que resolvesse o problema de agrupamento. O que eu encontrei trabalhando foi fazer a comparação de strings convertendo as strings em uma representação hexadecimal de seus caracteres. No database, isso é feito com HEX(column). Para PHP você pode usar esta function:

 public static function strToHex($string) { $hex = ''; for ($i=0; $i 

Ao fazer a consulta do database, sua string UTF8 original deve ser convertida primeiro em uma string iso (por exemplo, usando utf8_decode() no PHP) antes de usá-la no database. Por causa do tipo de agrupamento, o database não pode ter caracteres UTF8, portanto a comparação deve funcionar caso isso mude a string original (convertendo caracteres UTF8 que não são existentes no conjunto de caracteres ISO resultam em? Ou eles são removidos completamente). Apenas certifique-se de que, ao gravar dados no database, você use a mesma conversão de UTF8 para ISO.

Eu tive minha tabela originalmente criada com CHARSET = latin1 . Após a conversão da tabela para utf8 algumas colunas não foram convertidas, no entanto isso não era realmente óbvio. Você pode tentar executar SHOW CREATE TABLE my_table; e veja qual coluna não foi convertida ou apenas corrija o conjunto incorreto de caracteres na coluna problemática com a consulta abaixo (mude o comprimento varchar e CHARSET e COLLATE de acordo com suas necessidades):

  ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 COLLATE utf8_general_ci NULL; 

Depois de fazer suas correções listadas na resposta principal, altere as configurações padrão do seu servidor.

Em seu ” /etc/my.cnf.d/server.cnf ” ou onde quer que esteja localizado, adicione os padrões à seção [mysqld] para que fique assim:

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci 

Fonte: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html