mysql - utf8_unicode_ci - illegal mix of collations utf8_spanish2_ci implicit and utf8_general_ci implicit
Error de mezcla ilegal de colaciones en MySql (16)
¡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
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'';
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
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.
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)
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!
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.
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.
Si quiere evitar cambiar la sintaxis 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.
Use ascii_bin donde sea posible, coincidirá con casi cualquier intercalación. Un nombre de usuario rara vez acepta caracteres especiales de todos modos.
[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.
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 :)
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;
- Verifique que su columna users.gender sea INTEGER.
- Pruebe: los
alter table users convert to character set latin1 collate latin1_swedish_ci;