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_ci
lugar de la que se utf8mb4_bin
hace en la pregunta. Pero simplemente puedes reemplazar esto.
mysql -uroot -pThatrootPassWord < alterTables.sql
funciona. Y como ya notó, utf8mb4_bin es lo que, entre otros, recomienda nextcloud.