sql >> Base de Datos >  >> RDS >> Mysql

¿Efectos de actualizar una tabla con filas de utf8_turkish_ci a utf8_general_ci?

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?

  1. Tus datos no cambiarán (a menos que también modifiques el juego de caracteres). Eso es bueno.
  2. Se regenerarán todos los índices que involucren columnas con intercalaciones.
  3. 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)