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_ci
anstatt 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.