Error de MySQL de mezcla ilegal de intercalaciones


Estoy recibiendo 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 necesito cambiar la codificación de mi tabla de alguna manera, y si es así, a qué debo cambiarla?

Author: OMG Ponies, 2009-06-17

7 answers

SET collation_connection = 'utf8_general_ci';

Luego 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 cuela sueco allí a veces sin razón razonable.

 225
Author: Ben Hughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-06 22:35:20

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';
 11
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-17 16:59:44
CONVERT(column1 USING utf8)

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

 4
Author: Binaya Shrestha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 11:08:03

Use la siguiente declaración para el error

Tenga cuidado con sus datos tomar copia de seguridad si los datos tienen en la tabla.

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
 2
Author: vpgodara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-11 08:16:04

En general, la mejor manera es cambiar la clasificación de la tabla. Sin embargo, tengo una aplicación antigua y no son realmente capaces de estimar el resultado si esto tiene efectos secundarios. Por lo tanto, intenté de alguna manera convertir la cadena en algún otro formato que resolviera el problema de intercalación. Lo que encontré funcionando 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 esto 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 hacer la consulta de la base de datos, su 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 tener caracteres UTF8 dentro, por lo que el evento comparism debería funcionar, aunque esto cambia la cadena original (la conversión de caracteres UTF8 que no existen en el conjunto de caracteres ISO resulta en un ? o estos se eliminan por completo). Solo asegúrese de que cuando escriba datos en el base de datos, que utiliza la misma UTF8 a la conversión ISO.

 0
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-12 11:29:47

Tuve mi tabla originalmente creada con CHARSET=latin1. Después de la conversión de la 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 (cambie la longitud y el CONJUNTO de caracteres varchar y COLÓQUELOS de acuerdo con sus necesidades):

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;
 0
Author: A Kunin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-08 02:30:12

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

En su "/etc/my.cnf.d/servidor.cnf " o donde quiera que se encuentre 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

 0
Author: ITI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 17:21:06