Mezcla ilegal de queueciones Error de MySQL

Recibo este extraño error al procesar una gran cantidad de datos …

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€' 

¿Qué puedo hacer para resolver esto? ¿Puedo escaping de la cadena de alguna manera para que este error no ocurra, o tengo que cambiar la encoding de mi tabla de alguna manera, y si es así, ¿en qué debería cambiarlo?

 SET collation_connection = 'utf8_general_ci'; 

entonces para sus bases de datos

 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; 

MySQL se escabulle sueco allí a veces sin ninguna razón sensata.

Debe establecer tanto la encoding de la tabla como la encoding de la connection en UTF-8 :

 ALTER TABLE keywords CHARACTER SET UTF8; -- run once 

y

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

Tenía mi table creada originalmente con CHARSET = latin1 . Después de la conversión de tabla a utf8 algunas columnas no se convirtieron, sin embargo, eso no era realmente obvio. Puede intentar ejecutar SHOW CREATE TABLE my_table; y ver qué columna no se convirtió o simplemente corregir el set de caracteres incorrecto en la columna problemática con la consulta a continuación (cambiar la longitud varchar y CHARSET y COLLATE según sus necesidades):

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

En general, la mejor manera es cambiar la intercalación de tablas. Sin embargo, tengo una aplicación antigua y no puedo estimar el resultado si esto tiene efectos secundarios. Por lo tanto, traté de alguna manera de convertir la cadena en algún otro formatting que resolviera el problema de intercalación. Lo que encontré trabajando es hacer la comparación de cadenas convirtiendo las cadenas en una representación hexadecimal de sus caracteres. En la database esto se hace con HEX(column). Para PHP puede usar esta function:

 public static function strToHex($string) { $hex = ''; for ($i=0; $i<strlen($string); $i++){ $ord = ord($string[$i]); $hexCode = dechex($ord); $hex .= substr('0'.$hexCode, -2); } return strToUpper($hex); } 

Al realizar la consulta de la database, la cadena UTF8 original debe convertirse primero en una cadena iso (por ejemplo, usando utf8_decode() en PHP) antes de usarla en la database. Debido al tipo de intercalación, la database no puede contener caracteres UTF8, por lo que la comparación debería funcionar, aunque esto cambia la cadena original (la conversión de caracteres UTF8 que no existen y el resultado del juego de caracteres ISO en a? O estos se eliminan por completo). Solo asegúrese de que cuando escriba datos en la database, use la misma conversión de UTF8 a ISO.