utf8_unicode_ci utf8_spanish_ci utf8_general_ci illegal for error collations code and mysql sql mysql-error-1267

utf8_spanish_ci - Mezcla ilegal de colaciones Error de MySQL



illegal mix of collations utf8_general_ci implicit and utf8_unicode_ci implicit (7)

Debe establecer tanto la codificación de la tabla como la codificación de la conexión en UTF-8 :

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

y

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

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 escapar de la cadena de alguna manera para que este error no ocurra, o tengo que cambiar la codificación de mi tabla de alguna manera, y si es así, ¿en qué debería cambiarlo?


Después de hacer sus correcciones enumeradas en la respuesta superior, cambie la configuración predeterminada de su servidor.

En su " /etc/my.cnf.d/server.cnf " o donde sea que esté ubicado, agregue los valores predeterminados a la sección [mysqld] para que se vea así:

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

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


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 formato 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 base de datos esto se hace con HEX(column). Para PHP puede usar esta función:

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 base de datos, la cadena UTF8 original debe convertirse primero en una cadena iso (por ejemplo, usando utf8_decode() en PHP) antes de usarla en la base de datos. Debido al tipo de intercalación, la base de datos 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 base de datos, use la misma conversión de UTF8 a ISO.


Tenía mi mesa 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 conjunto 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;


Use la siguiente declaración para el error

tenga cuidado con su copia de seguridad de datos si los datos tienen en la tabla.

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;


CONVERT(column1 USING utf8)

Resuelve mi problema Donde column1 es la columna que me da este error.


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.