Ho una soluzione che convertirà database e tabelle eseguendo alcuni comandi. Inoltre converte tutte le colonne di tipo varchar
, text
, tinytext
, mediumtext
, longtext
, char
. È inoltre necessario eseguire il backup del database in caso di problemi.
Copia il seguente codice in un file chiamato 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');
Sostituisci tutte le occorrenze di "yourDbName" con il database che desideri convertire. Quindi eseguire:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Ciò genererà un nuovo file alterTables.sql, con tutte le query necessarie per convertire il database. Eseguire il comando seguente per avviare la conversione:
mysql -uroot < alterTables.sql
È inoltre possibile adattarlo per l'esecuzione su più database, modificando la condizione per table_schema. Ad esempio table_schema like "wiki_%"
, convertirà tutti i database con il prefisso del nome wiki_
. Per convertire tutti i database, sostituire la condizione con table_type!='SYSTEM VIEW'
.
Un problema che potrebbe sorgere. Avevo alcune colonne varchar (255) nelle chiavi mysql. Ciò provoca un errore:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Se ciò accade, puoi semplicemente modificare la colonna in modo che sia più piccola, come varchar (150), ed eseguire nuovamente il comando.
Nota : questa risposta converte il database in utf8mb4_unicode_ci
invece di utf8mb4_bin
, posto nella domanda. Ma puoi semplicemente sostituirlo.
mysql -uroot -pThatrootPassWord < alterTables.sql
funziona. E come hai già notato, utf8mb4_bin è ciò che, tra l'altro, nextcloud consiglia.