Tengo una solución que convertirá bases de datos y tablas ejecutando algunos comandos. También convierte todas las columnas del tipo varchar, text, tinytext, mediumtext, longtext, char. También debe hacer una copia de seguridad de su base de datos en caso de que algo se rompa.
Copie el siguiente código en un archivo llamado 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');
Reemplace todas las ocurrencias de "yourDbName" con la base de datos que desea convertir. Entonces corre:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Esto generará un nuevo archivo alterTables.sql, con todas las consultas que necesita para convertir la base de datos. Ejecute el siguiente comando para iniciar la conversión:
mysql -uroot < alterTables.sql
También puede adaptar esto para que se ejecute a través de múltiples bases de datos, cambiando la condición para el esquema_tabla. Por ejemplo table_schema like "wiki_%", convertirá todas las bases de datos con el prefijo de nombre wiki_. Para convertir todas las bases de datos, reemplace la condición con table_type!='SYSTEM VIEW'.
Un problema que podría surgir. Tenía algunas columnas varchar (255) en las claves mysql. Esto causa un error:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Si eso sucede, simplemente puede cambiar la columna para que sea más pequeña, como varchar (150), y volver a ejecutar el comando.
Tenga en cuenta : esta respuesta convierte la base de datos en utf8mb4_unicode_cilugar de la que se utf8mb4_binhace en la pregunta. Pero simplemente puedes reemplazar esto.
mysql -uroot -pThatrootPassWord < alterTables.sqlfunciona. Y como ya notó, utf8mb4_bin es lo que, entre otros, recomienda nextcloud.