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_ci
zamiast utf8mb4_bin
, zadane w pytaniu. Ale możesz to po prostu zastąpić.
mysql -uroot -pThatrootPassWord < alterTables.sql
działa. I jak już zauważyłeś, utf8mb4_bin jest tym, co poleca między innymi nextcloud.