Mam rozwiązanie, które przekonwertuje bazy danych i tabele, uruchamiając kilka poleceń. To również konwertuje wszystkie kolumny typu varchar, text, tinytext, mediumtext, longtext, char. Należy również wykonać kopię zapasową bazy danych na wypadek, gdyby coś się zepsuło.
Skopiuj następujący kod do pliku o nazwie 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');
Zamień wszystkie wystąpienia „twojaDbName” na bazę danych, którą chcesz przekonwertować. Następnie uruchomić:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Spowoduje to wygenerowanie nowego pliku alterTables.sql ze wszystkimi zapytaniami potrzebnymi do konwersji bazy danych. Uruchom następujące polecenie, aby rozpocząć konwersję:
mysql -uroot < alterTables.sql
Można to również dostosować, aby działało w wielu bazach danych, zmieniając warunek dla tabeli_schema. Na przykład table_schema like "wiki_%"skonwertuje wszystkie bazy danych z prefiksem nazwy wiki_. Aby przekonwertować wszystkie bazy danych, zamień warunek na table_type!='SYSTEM VIEW'.
Problem, który może się pojawić. Miałem trochę kolumn varchar (255) w kluczach mysql. To powoduje błąd:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Jeśli tak się stanie, możesz po prostu zmienić kolumnę na mniejszą, jak varchar (150), i ponownie uruchomić polecenie.
Uwaga : Ta odpowiedź konwertuje bazę danych na utf8mb4_unicode_cizamiast utf8mb4_bin, zadane w pytaniu. Ale możesz to po prostu zastąpić.
mysql -uroot -pThatrootPassWord < alterTables.sqldziała. I jak już zauważyłeś, utf8mb4_bin jest tym, co poleca między innymi nextcloud.