Error de mezcla ilegal de colaciones en MySql

¡Acabo de recibir esta respuesta de una pregunta anterior y funciona como un regalo!

SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM ratings WHERE month='Aug' GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC 

Pero cuando agrego este bit adicional, aparece este error:

Documentación n. ° 1267 – Mezcla ilegal de intercalaciones (latin1_swedish_ci, IMPLICIT) y (latin1_general_ci, IMPLICIT) para la operación ‘=’

 SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM ratings WHERE month='Aug' **AND username IN (SELECT username FROM users WHERE gender =1)** GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC 

La mesa es:

id, username, rating, month

Compruebe el tipo de clasificación de cada tabla y asegúrese de que tengan la misma intercalación.

Después de eso, compruebe también el tipo de clasificación de cada campo de tabla que haya usado en operación.

Me encontré con el mismo error, y esos trucos me funcionan.

A continuación, se indica cómo verificar qué columnas son la intercalación incorrecta:

 SELECT table_schema, table_name, column_name, character_set_name, collation_name FROM information_schema.columns WHERE collation_name = 'latin1_general_ci' ORDER BY table_schema, table_name,ordinal_position; 

Y aquí está la consulta para solucionarlo:

 ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin1 COLLATE 'latin1_swedish_ci'; 

Enlazar

[MySQL]

En estos casos (muy raros):

  • dos tablas que realmente necesitan diferentes tipos de clasificación
  • valores que no provienen de una tabla, sino de una enumeración explícita, por ejemplo:

    SELECCIONE 1 AS números UNION ALL SELECT 2 UNION ALL SELECT 3

puede comparar los valores entre las diferentes tablas usando CAST o CONVERT:

 CAST('my text' AS CHAR CHARACTER SET utf8) CONVERT('my text' USING utf8) 

Vea la documentación CONVERT y CAST en el sitio web de MySQL.

Estaba obteniendo el mismo error en PhpMyadmin e hice la solución indicada aquí que funcionó para mí

 ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Mezcla ilegal de colaciones Error de MySQL También recomendaría ir con General en lugar de sueco ya que ése es el predeterminado y no usar el idioma a menos que su aplicación esté usando el sueco.

  • Verifique que su columna users.gender sea INTEGER.
  • Pruebe: los alter table users convert to character set latin1 collate latin1_swedish_ci;

Necesita cambiar la colación de cada columna de latin1_general_ci a latin1_swedish_ci

Obtuve el mismo error dentro de un procedimiento almacenado, en la cláusula where. Descubrí que el problema ocurría con una variable declarada local, previamente cargada por la misma tabla / columna.

Resolví lanzar los datos a un solo tipo de caracteres.

En resumen, este error es causado por MySQL tratando de hacer una operación en dos cosas que tienen diferentes configuraciones de intercalación. Si haces que la configuración coincida, el error desaparecerá. Por supuesto, debe elegir la configuración correcta para su base de datos, dependiendo de para qué se va a utilizar.

Aquí hay algunos buenos consejos para elegir entre dos colaciones utf8 muy comunes: ¿Cuál es la diferencia entre utf8_general_ci y utf8_unicode_ci

Si está utilizando phpMyAdmin, puede hacerlo de forma sistemática trabajando en las tablas mencionadas en su mensaje de error y verificando el tipo de clasificación para cada columna. Primero debe verificar cuál es la configuración general de colación para su base de datos: phpMyAdmin puede informarle esto y modificarlo si es necesario. Pero cada columna en cada tabla puede tener su propia configuración. Normalmente querrás que todos estos coincidan.

En una base de datos pequeña, esto es bastante fácil de hacer a mano y, en cualquier caso, si lee el mensaje de error en su totalidad, generalmente lo dirigirá al lugar correcto. No se olvide de mirar la configuración de ‘estructura’ para las columnas con subtablas también. Cuando encuentre una intercalación que no concuerde, puede cambiarla usando phpMyAdmin directamente, sin necesidad de usar la ventana de consulta. Luego prueba tu operación nuevamente. Si el error persiste, ¡sigue buscando!

Creo que deberías convertir a utf8

 --set utf8 for connection SET collation_connection = 'utf8_general_ci' --change CHARACTER SET of DB to utf8 ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci --change CHARACTER SET of table to utf8 ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

El problema aquí principalmente, solo eche el campo como este elenco (campo como varchar) o cast (campos como fecha)

 SELECT username, AVG(rating) as TheAverage, COUNT(*) as TheCount FROM ratings WHERE month='Aug' AND username COLLATE latin1_general_ci IN ( SELECT username FROM users WHERE gender = 1 ) GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC; 

Use ascii_bin donde sea posible, coincidirá con casi cualquier intercalación. Un nombre de usuario rara vez acepta caracteres especiales de todos modos.

Si quiere evitar cambiar la syntax para resolver este problema, intente esto:

Actualice su MySQL a la versión 5.5 o superior.

Esto resolvió el problema para mí.

Tengo el mismo problema con la advertencia de recolección para un campo que está configurado de 0 a 1. Todas las colecciones de columnas son las mismas. Intentamos cambiar las colecciones nuevamente pero nada soluciona este problema.

Al final, actualizamos el campo a NULL y luego actualizamos a 1 y esto supera el problema de la colección.

 HAvING TheCount > 4 AND username IN (SELECT username FROM users WHERE gender=1) 

pero por qué estoy respondiendo, no me votaste como la respuesta correcta 🙂

Asegúrese de que su versión de MySQL sea compatible con subconsultas (4.1+). A continuación, puede intentar volver a escribir su consulta a algo como esto:

 SELECT ratings.username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM ratings, users WHERE ratings.month='Aug' and ratings.username = users.username AND users.gender = 1 GROUP BY ratings.username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC