Dans MySQL, lorsque vous spécifiez UTF-8 comme jeu de caractères pour une colonne, le jeu de caractères utf8mb3 est utilisé par défaut. Ce jeu de caractères utilise un maximum de 3 octets pour stocker un caractère. Pour stocker des informations telles que les emojis, vous devez modifier le jeu de caractères de la colonne en utf8mb4. Généralement, la modification du jeu de caractères d'une colonne nécessite la reconstruction de la table. Ce processus prend du temps et peut avoir un impact significatif sur votre activité. PolarDB for MySQL prend en charge la modification instantanée du jeu de caractères des colonnes. Cette fonctionnalité vous permet de modifier rapidement le jeu de caractères sans impacter votre activité.
Prérequis
Votre cluster doit utiliser l'une des versions suivantes :
-
PolarDB for MySQL 8.0.1 avec une version de révision 8.0.1.1.40 ou ultérieure. Vous pouvez utiliser la rubrique Interroger le numéro de version pour confirmer la version du cluster.
RemarqueVous devez configurer le paramètre
loose_innodb_support_instant_modify_charsetavant de pouvoir utiliser cette fonctionnalité sur les clusters PolarDB for MySQL 8.0.1. -
PolarDB for MySQL 8.0.2.
RemarqueLes clusters PolarDB for MySQL 8.0.2 prennent en charge la fonctionnalité de modification instantanée du jeu de caractères des colonnes par défaut. Vous n'avez pas besoin de configurer de paramètres.
Limites
Vous ne pouvez modifier le jeu de caractères que pour les colonnes de type CHAR, VARCHAR, ENUM et TEXT.
Vous pouvez uniquement modifier le jeu de caractères d'une colonne de utf8mb3 vers utf8mb4, ou changer n'importe quel jeu de caractères vers le type BINARY.
Aucun index ne doit exister sur la colonne dont vous souhaitez modifier le jeu de caractères.
-
Avant et après la modification du jeu de caractères, la longueur de la colonne doit respecter les exigences suivantes :
-
La longueur de stockage maximale de la colonne doit être soit inférieure à 256 octets avant et après la modification, soit supérieure à 255 octets avant et après la modification. La longueur de stockage correspond à l'espace de stockage réel consommé par le jeu de caractères.
Par exemple, prenons une colonne VARCHAR(85) qui utilise le jeu de caractères utf8mb3. Étant donné que utf8mb3 utilise un maximum de 3 octets pour stocker un caractère, la longueur de stockage maximale de cette colonne est de
85*3=255octets. Si vous modifiez le jeu de caractères de cette colonne en utf8mb4, sa longueur de stockage maximale devient85*4=340octets. Comme la longueur de stockage maximale après la modification est supérieure à 256 octets, le jeu de caractères ne peut pas être modifié instantanément. -
La longueur de stockage maximale de la colonne avec le jeu de caractères cible ne peut pas être inférieure à sa longueur de stockage maximale avec le jeu de caractères d'origine.
Par exemple, prenons une colonne CHAR(120) qui utilise le jeu de caractères utf8mb3. La longueur de stockage maximale de la colonne est de
120*3=360octets. Après avoir changé la colonne vers le type BINARY, la longueur de stockage maximale de la colonne devient120*1=120octets. Par conséquent, cette colonne ne répond pas aux exigences pour une modification instantanée du jeu de caractères de la colonne.
-
Procédure
-
Configurez le paramètre.
Pour PolarDB for MySQL 8.0.1, vous devez définir le paramètre
loose_innodb_support_instant_modify_charsetsur ON pour utiliser la fonctionnalité de modification instantanée du jeu de caractères des colonnes. Pour obtenir des instructions sur la définition des valeurs des paramètres, consultez la rubrique Définir les paramètres du cluster et des nœuds.Nom du paramètre
Niveau du paramètre
Description
loose_innodb_support_instant_modify_charset
Global
Contrôle la fonctionnalité de modification instantanée du jeu de caractères des colonnes. Valeurs valides :
OFF (par défaut) : Désactive la fonctionnalité de modification instantanée du jeu de caractères des colonnes.
ON : Active la fonctionnalité de modification instantanée du jeu de caractères des colonnes.
-
Modifiez le jeu de caractères de la colonne.
-
Spécifiez ALGORITHM=INPLACE pour forcer l'utilisation de la fonctionnalité de modification instantanée du jeu de caractères des colonnes. Exemple :
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = INPLACE;Lorsque vous utilisez l'instruction précédente, l'erreur suivante indique que l'algorithme INPLACE ne peut pas effectuer la modification actuelle du jeu de caractères de la colonne. Vérifiez que le paramètre
loose_innodb_support_instant_modify_charsetest défini sur ON et assurez-vous que les conditions décrites dans la section Limites sont respectées.ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. -
Si vous ne spécifiez pas ALGORITHM ou si vous spécifiez ALGORITHM=DEFAULT, PolarDB sélectionne automatiquement l'algorithme le plus rapide pour effectuer la modification. Exemples :
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = DEFAULT; ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4;
-
Résultats
L'exemple suivant utilise les tables t1 et t2 pour comparer les résultats de la modification du jeu de caractères d'une colonne de utf8mb3 vers utf8mb4 avec la fonctionnalité de modification instantanée du jeu de caractères des colonnes activée et désactivée. Chaque table contient 10 millions d'enregistrements. Les tables t1 et t2 ont des schémas de table et des volumes de données identiques.
-
Lorsque la fonctionnalité de modification instantanée du jeu de caractères des colonnes est désactivée, la modification du jeu de caractères de la colonne nécessite la reconstruction de la table. L'opération prend environ 1 minute. Pendant tout le processus de langage de définition de données (DDL), seules les opérations de requête sont autorisées.
ALTER TABLE t1 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '';Le résultat suivant est renvoyé :
Query OK, 10000000 rows affected (59.66 sec) Records: 10000000 Duplicates: 0 Warnings: 0 -
Après avoir activé la fonctionnalité de modification instantanée du jeu de caractères des colonnes, la modification du jeu de caractères de la colonne s'effectue en quelques secondes, quel que soit le volume de données de la table.
ALTER TABLE t2 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',ALGORITHM = INPLACE;Le résultat suivant est renvoyé :
Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
Nous contacter
Si vous avez des questions concernant les opérations DDL, Contactez-nous.