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 no se produzca este error, o necesito cambiar la codificación de mi tabla de alguna manera, y si es así, a qué debo cambiarla?
mysql
sql
mysql-error-1267
Haga clic en Upvote
fuente
fuente
Respuestas:
luego para tus bases de datos
MySQL se cuela sueco allí a veces sin ninguna razón sensata.
fuente
Debe configurar tanto la codificación de la tabla como la codificación de la conexión en
UTF-8
:y
fuente
myDb
EL CONJUNTO DE CARACTERES POR DEFECTO DE LA BASE DE DATOS utf8 COLLATE utf8_bin. Funcionaría eso? Esto se hace para que afecte a todas mis tablas, no solo a una de ellasResuelve mi problema. Donde column1 es la columna que me da este error.
fuente
Utilice la siguiente declaración para el error
Tenga cuidado con la copia de seguridad de sus datos si los datos están en la tabla.
fuente
En general, la mejor forma es cambiar la clasificación de la tabla. Sin embargo, tengo una aplicación antigua y realmente no puedo 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 clasificación. Lo que encontré funcionando es comparar 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:Al realizar la consulta de la base de datos, su cadena UTF8 original debe convertirse primero en una cadena iso (por ejemplo, usarla
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 la comparación debería funcionar aunque esto cambie la cadena original (la conversión de caracteres UTF8 que no existen en el conjunto de caracteres ISO da como resultado un? O estos se eliminan por completo). Solo asegúrese de que cuando escriba datos en la base de datos, utilice la misma conversión de UTF8 a ISO.fuente
Tenía mi tabla creada originalmente con CHARSET = latin1 . Después de la conversión de la tabla a utf8, algunas columnas no se convirtieron, sin embargo, eso no fue realmente obvio. Puede intentar ejecutar
SHOW CREATE TABLE my_table;
y ver qué columna no se convirtió o simplemente corregir el juego de caracteres incorrecto en la columna problemática con la consulta a continuación (cambie la longitud de varchar y CHARSET y COLLATE según sus necesidades):fuente
Cambie el juego de caracteres de la tabla a utf8
fuente
Después de realizar las correcciones enumeradas en la respuesta principal, 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í:
Fuente: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
fuente
Descubrí que usar
cast()
era la mejor solución para mí:También hay una
convert()
función. Más detalles aquíOtro recurso aquí
fuente
Mi cuenta de usuario no tenía los permisos para modificar la base de datos y la tabla, como se sugiere en esta solución .
Si, como yo, no le importa la intercalación de caracteres (está utilizando el operador '='), puede aplicar la corrección inversa. Ejecute esto antes de su SELECT:
fuente