Ich habe eine Lösung, die Datenbanken und Tabellen durch Ausführen einiger Befehle konvertiert. Es wandelt auch alle Spalten des Typs varchar, text, tinytext, mediumtext, longtext, char. Sie sollten auch Ihre Datenbank sichern, falls etwas kaputt geht.
Kopieren Sie den folgenden Code in eine Datei mit dem Namen 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');
Ersetzen Sie alle Vorkommen von "yourDbName" durch die Datenbank, die Sie konvertieren möchten. Dann renne:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Dadurch wird eine neue Datei alterTables.sql mit allen Abfragen generiert, die Sie zum Konvertieren der Datenbank benötigen. Führen Sie den folgenden Befehl aus, um die Konvertierung zu starten:
mysql -uroot < alterTables.sql
Sie können dies auch anpassen, um mehrere Datenbanken zu durchlaufen, indem Sie die Bedingung für table_schema ändern. Zum Beispiel table_schema like "wiki_%"werden alle Datenbanken mit dem Namenspräfix konvertiert wiki_. Um alle Datenbanken zu konvertieren, ersetzen Sie die Bedingung durch table_type!='SYSTEM VIEW'.
Ein Problem, das auftreten könnte. Ich hatte einige varchar (255) Spalten in MySQL-Schlüsseln. Dies verursacht einen Fehler:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
In diesem Fall können Sie einfach die Spalte wie varchar (150) verkleinern und den Befehl erneut ausführen.
Bitte beachten Sie : Diese Antwort konvertiert die Datenbank in, utf8mb4_unicode_cianstatt utf8mb4_bin, in der Frage gestellt. Aber Sie können dies einfach ersetzen.
mysql -uroot -pThatrootPassWord < alterTables.sql. Und wie Sie bereits bemerkt haben, ist utf8mb4_bin unter anderem das, was nextcloud empfiehlt.