phpMyAdmin
 sql >> Base de données >  >> Database Tools >> phpMyAdmin

Qu'adviendra-t-il des données existantes si je modifie le classement d'une colonne dans MySQL ?

L'article http://mysqldump.azundris.com/archives/60 -Handling-character-sets.html en discute longuement et montre également ce qui va se passer.

Veuillez noter que vous confondez un CHARACTER SET (en fait un encodage) avec un COLLATION.

Un jeu de caractères définit la représentation physique d'une chaîne en octets sur le disque. Vous pouvez rendre cela visible, en utilisant la fonction HEX(), par exemple SELECT HEX(str) FROM t WHERE id = 1 pour voir comment MySQL stocke les octets de votre chaîne. Ce que MySQL vous livre peut être différent, selon le jeu de caractères de votre connexion, défini avec SET NAMES .... .

Une collation est un ordre de tri. Cela dépend du jeu de caractères. Par exemple, vos données peuvent être dans le jeu de caractères latin1, mais elles peuvent être classées selon l'un des deux ordres de tri allemand latin1_german1_ci ou latin1_german2_ci. Selon votre choix, les trémas tels que ö seront triés en oe ou en o.

Lorsque vous modifiez un jeu de caractères, les données de votre table doivent être réécrites. MySQL lira toutes les données et tous les index de la table, fera une copie cachée de la table qui occupe temporairement de l'espace disque, puis déplacera l'ancienne table dans un emplacement caché, déplacera la table cachée en place, puis supprimera les anciennes données, libérant jusqu'à l'espace disque. Pendant un certain temps, vous aurez besoin de deux fois plus d'espace de stockage pour cela.

Lorsque vous modifiez un classement, l'ordre de tri des données change, mais pas les données elles-mêmes. Si la colonne que vous modifiez ne fait pas partie d'un index, rien ne doit être fait à part réécrire le fichier frm, et les versions suffisamment récentes de MySQL ne devraient pas faire plus.

Lorsque vous modifiez le classement d'une colonne faisant partie d'un index, l'index doit être réécrit, car un index est un extrait trié d'une table. Cela déclenchera à nouveau la logique de copie de table ALTER TABLE décrite ci-dessus.

MySQL essaie de conserver les données en procédant comme suit :tant que les données dont vous disposez peuvent être représentées dans le jeu de caractères cible, la conversion ne sera pas avec perte. Des avertissements seront imprimés en cas de troncature de données, et les données qui ne peuvent pas être représentées dans le jeu de caractères cible seront remplacées par ?