2009-08-06 20 views
32

Acabo de recibir esta respuesta de una pregunta anterior y funciona de maravilla.Mezcla ilegal de error de intercalaciones en MySql

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 me pego este bit adicional en que da este error:

Documentation #1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='

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 tabla es:

id, username, rating, month

Respuesta

13

Comprobar el tipo de intercalación de cada mesa, y asegúrese de que tienen la misma intercalación.

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

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

-2

Asegúrese de que su versión de los soportes de MySQL subconsultas (4.1+). A continuación, usted podría intentar volver a escribir la consulta para 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 
+0

por cierto, ¿su columna users.gender es de tipo int? – stereoscott

+0

Intenté eso: SELECCIONAR ratings.username, (SUM (ratings.rating)/COUNT (*)) como TheAverage, Count (*) como TheCount FROM ratings, usuarios WHERE ratings.month = 'Aug' y ratings.username = users.username AND users.gender = 1 GROUP BY ratings.username HAVING TheCount> 4 ORDER BY TheAverage DESC, TheCount DESC ¿Tiene el mismo error que antes? Sí, Gender is an int. – Oliver

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

pero ¿por qué estoy respondiendo, me dont votado respuesta como correcta :)

+0

Hola, ya lo intenté de esa manera y obtuve el mismo error. – Oliver

+0

ok veo el error que postet en el comentario. ¿el error no lo dice todo? sus tablas o campos tienen una intercalación mixta. lo cambió para que todas las tablas/campos tengan la misma intercalación. – Rufinus

+0

por cierto. realmente debería usar una unión como lo sugiere stereointeractive.com. Su subconsulta se ejecuta para cada fila que es un poco lenta. ver también http://dev.mysql.com/doc/refman/5.0/en/optimizing-subqueries.html – Rufinus

1
  • Compruebe que el users.gender la columna es INTEGER
  • Probar: alter table users convert to character set latin1 collate latin1_swedish_ci;
0
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; 
64

Aquí es cómo comprobar qué columnas son la colación equivocada:

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'; 

Link

+0

¡Gracias, esto me salvó el día! – rahimv

1

necesita cambiar cada una intercalación de columna de latin1_general_ci a latin1_swedish_ci

4

que estaba recibiendo este mismo error en PhpMyadmin y no la solución indicada aquí, que trabajó para mí

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Illegal mix of collations MySQL Error También recomendaría ir con el general en lugar de sueco, ya que uno está predeterminado y no utilizar el lenguaje a menos que su aplicación esté usando sueco.

1

Tengo este 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.

Lo resolví lanzando los datos a un solo tipo de caracteres.

1

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 sobre cómo elegir entre dos colaciones utf8 muy comunes: What's the difference between utf8_general_ci and utf8_unicode_ci

Si está utilizando phpMyAdmin se puede hacer esto de forma sistemática trabajando a través de las tablas mencionadas en el mensaje de error, y comprobando el tipo de intercalació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 pequeña base de datos, esto es bastante fácil de hacer a mano, y en cualquier caso, si lee el mensaje de error en su totalidad, generalmente le indicará el 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!

1

creo que debe 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 
6

[MySQL]

En estas (muy raro) casos:

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

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

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

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

CONVERT('my text' USING utf8) 

Ver CONVERT and CAST documentation en el sitio web de MySQL.

+0

No son tan raros, los obtengo con bastante frecuencia en nuestro sitio multilingüe. –

0

El problema aquí principalmente, al emitir el campo como este elenco (campo como varchar) o fundido (campos como la fecha)

0

Uso ascii_bin siempre que sea posible, que coincidirá con casi cualquier cotejo. Un nombre de usuario rara vez acepta caracteres especiales de todos modos.

0

Si desea evitar el cambio de sintaxis para resolver este problema, intente esto:

actualización de su MySQL a la versión 5.5 o superior.

Esto resolvió el problema para mí.

+0

Esto puede no ser cierto. Tengo la versión 5.6.35 y sigo teniendo este error –

0

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 eran iguales. Intentamos cambiar las colecciones nuevamente pero nada soluciona este problema.

Al final actualizamos el campo a NULL y después de eso actualizamos a 1 y esto supera el problema de la colección.

Cuestiones relacionadas