J'ai une solution qui convertira les bases de données et les tables en exécutant quelques commandes. Il convertit également toutes les colonnes du type varchar
, text
, tinytext
, mediumtext
, longtext
, char
. Vous devriez également sauvegarder votre base de données au cas où quelque chose se briserait.
Copiez le code suivant dans un fichier appelé preAlterTables.sql:
use information_schema;
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "yourDbName" group by table_schema;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "yourDbName" group by table_schema, table_name;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like "yourDbName" and data_type in ('varchar','char');
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like "yourDbName" and data_type in ('text','tinytext','mediumtext','longtext');
Remplacez toutes les occurrences de "yourDbName" par la base de données que vous souhaitez convertir. Puis lancez:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Cela générera un nouveau fichier alterTables.sql, avec toutes les requêtes dont vous avez besoin pour convertir la base de données. Exécutez la commande suivante pour démarrer la conversion:
mysql -uroot < alterTables.sql
Vous pouvez également l'adapter pour exécuter plusieurs bases de données en modifiant la condition pour la table_schema. Par exemple table_schema like "wiki_%"
, toutes les bases de données portant le préfixe seront converties wiki_
. Pour convertir toutes les bases de données, remplacez la condition par table_type!='SYSTEM VIEW'
.
Un problème qui pourrait survenir. J'ai eu quelques varchar (255) colonnes dans les clés mysql. Cela provoque une erreur:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Si cela se produit, vous pouvez simplement changer la colonne pour qu'elle soit plus petite, comme varchar (150), et réexécuter la commande.
S'il vous plaît noter : Cette réponse convertit la base de données au utf8mb4_unicode_ci
lieu de utf8mb4_bin
, a demandé à la question. Mais vous pouvez simplement remplacer ceci.
mysql -uroot -pThatrootPassWord < alterTables.sql
fonctionne. Et comme vous l'avez déjà noté, utf8mb4_bin est ce que recommande, notamment, nextcloud.