sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

¿Qué pasará con los datos existentes si cambio la intercalación de una columna en MySQL?

El artículo http://mysqldump.azundris.com/archives/60 -Manejo-de-juegos-de-caracteres.html discute esto extensamente y también muestra lo que sucederá.

Tenga en cuenta que está mezclando un CONJUNTO DE CARACTERES (en realidad, una codificación) con una COLLATION.

Un juego de caracteres define la representación física de una cadena en bytes en el disco. Puede hacer esto visible, usando la función HEX(), por ejemplo SELECT HEX(str) FROM t WHERE id = 1 para ver cómo MySQL almacena los bytes de su cadena. Lo que MySQL le ofrece puede ser diferente, según el juego de caracteres de su conexión, definido con SET NAMES .... .

Una colación es un orden de clasificación. Depende del conjunto de caracteres. Por ejemplo, sus datos pueden estar en el conjunto de caracteres latin1, pero pueden estar ordenados de acuerdo con cualquiera de los dos órdenes de clasificación alemanes latin1_german1_ci o latin1_german2_ci. Dependiendo de su elección, las diéresis como ö se ordenarán como oe o como o.

Cuando está cambiando un conjunto de caracteres, los datos en su tabla deben reescribirse. MySQL leerá todos los datos y todos los índices de la tabla, hará una copia oculta de la tabla que ocupa espacio en disco temporalmente, luego moverá la tabla anterior a una ubicación oculta, moverá la tabla oculta a su lugar y luego soltará los datos antiguos, liberando hasta espacio en disco. Durante algún tiempo intermedio, necesitará el doble de almacenamiento para eso.

Cuando cambia una intercalación, el orden de clasificación de los datos cambia, pero no los datos en sí. Si la columna que está cambiando no forma parte de un índice, no es necesario hacer nada además de volver a escribir el archivo frm, y las versiones suficientemente recientes de MySQL no deberían hacer más.

Cuando cambia la intercalación de una columna que forma parte de un índice, el índice debe reescribirse, ya que un índice es un extracto ordenado de una tabla. Esto activará nuevamente la lógica de copia de tabla ALTER TABLE descrita anteriormente.

MySQL intenta conservar los datos haciendo esto:siempre que los datos que tenga se puedan representar en el conjunto de caracteres de destino, la conversión no tendrá pérdidas. Se imprimirán advertencias si se están truncando los datos, y los datos que no se puedan representar en el conjunto de caracteres de destino se reemplazarán por ?