Los datos de sus columnas se almacenan usando un conjunto de caracteres. En este caso parece ser utf8.
Cuando opera sobre esas columnas (haciendo, por ejemplo, comparaciones de igualdad u ordenación), MySQL emplea una intercalación. Cada columna tiene una intercalación predeterminada, que hereda de la intercalación predeterminada de la tabla.
Los índices tienen la intercalación predeterminada de la columna incorporada para que puedan funcionar de manera eficiente.
Puede hacer una comparación de igualdad calificada por intercalación. Por ejemplo, en un JOIN
puedes especificar
ON (turkish.village_name COLLATE utf8_general_ci) = euro.village_name
o quizás
ON turkish.village_name = (euro.village_name COLLATE utf8_turkish_ci)
Eso debería eliminar su mezcla ilegal de intercalaciones sin requerir que altere su tabla. Esto puede ayudarlo a evitar el cambio de base de datos sobre el que está preguntando. Pero cuidado, usando el COLLATE
El calificador puede anular el uso de un índice. Si tiene una tabla grande y confía en los índices para el rendimiento, esto puede no ser útil.
Entonces, ¿qué sucederá si modifica sus tablas para cambiar la intercalación predeterminada?
- Tus datos no cambiarán (a menos que también modifiques el juego de caracteres). Eso es bueno.
- Se regenerarán todos los índices que involucren columnas con intercalaciones.
- Sus comparaciones y pedidos pueden cambiar. No sé turco, así que no puedo decirte qué podría romperse. Pero, por ejemplo, en español las letras N y Ñ no son lo mismo. N viene antes de Ñ en la colación española, pero en la colación general se tratan como iguales. Puede haber algún aspecto del alfabeto turco que funcione igual, por lo que su
ORDER BY
los resultados serán incorrectos.
Pero puede arreglar eso especificando un COLLATE
modificador en su ORDER BY
cláusula.
ORDER BY (euro.village_name COLLATE utf8_turkish_ci)