2009-06-17 13 views
80

estoy recibiendo este extraño error al procesar un gran número de datos ...mezcla ilegal de error colaciones MySQL

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?

+0

este error, es un inyectable o no? –

Respuesta

192
SET collation_connection = 'utf8_general_ci'; 

a continuación 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 en sueco a veces sin ninguna razón sensata.

+2

funciona como un encanto :) –

+1

Fantástico amigo. funciona bien Gracias. – Sagotharan

+3

@Ben: gracias por una solución directamente copiable. Me ahorraste mucho tiempo. – Pistos

8

Es necesario configurar tanto la codificación de mesa y codificación conexión con UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once 

y

SET NAMES 'UTF8'; 
SET CHARACTER SET 'UTF8'; 
+0

¿Se necesitan ambos o puedo hacer uno de ellos? –

+0

ALTER DATABASE 'myDb' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Funcionaría eso? Esto se hace para que afecte todas mis tablas, no solo una de ellas –

+1

ALTER DATABASE no cambiará la configuración de la tabla actual, solo las de nueva creación. Sin embargo, no está de más alterar el juego de caracteres predeterminado para la base de datos. – Quassnoi

-1

En general, la mejor manera es cambiar la intercalación mesa. 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 hacer la consulta de base de datos, la cadena UTF8 original debe ser convertido primero en una cadena iso (por ejemplo, utilizando utf8_decode() en PHP) antes de usar en el DB. Debido a la colación escribir la base de datos no puede tener caracteres UTF8 en el interior por lo que el comparism debería funcionar caso de que esto cambia la cadena original (la conversión de caracteres UTF8 que no están existend en el resultado conjunto de caracteres ISO en un? 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.

0

Tenía mi mesa creada originalmente con CHARSET = latin1. Después de la conversión mesa para utf8 algunas columnas no se convirtieron, sin embargo, que no era muy obvio. Usted puede intentar ejecutar SHOW CREATE TABLE my_table; y ver qué columna no se había convertido o simplemente fijar carácter incorrecto encuentra en la columna problemática con consulta a continuación (cambio de longitud varchar y CHARSET y cotejar de acuerdo a sus necesidades):

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

Uso siguiente declaración para el error

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

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Cuestiones relacionadas