Eu tenho uma solução que irá converter bancos de dados e tabelas executando alguns comandos. Ele também converte todas as colunas do tipo varchar
, text
, tinytext
, mediumtext
, longtext
, char
. Você também deve fazer backup do seu banco de dados , caso algo ocorra.
Copie o seguinte código em um arquivo chamado 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');
Substitua todas as ocorrências de "yourDbName" pelo banco de dados que você deseja converter. Então corra:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Isso irá gerar um novo arquivo alterTables.sql, com todas as consultas necessárias para converter o banco de dados. Execute o seguinte comando para iniciar a conversão:
mysql -uroot < alterTables.sql
Você também pode adaptar isso para executar vários bancos de dados, alterando a condição do table_schema. Por exemplo table_schema like "wiki_%"
, converterá todos os bancos de dados com o prefixo do nome wiki_
. Para converter todos os bancos de dados, substitua a condição por table_type!='SYSTEM VIEW'
.
Um problema que pode surgir. Eu tinha algumas colunas varchar (255) nas chaves do mysql. Isso causa um erro:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Se isso acontecer, você pode simplesmente mudar a coluna para ser menor, como varchar (150), e executar novamente o comando.
Observação : esta resposta converte o banco de dados em utf8mb4_unicode_ci
vez de utf8mb4_bin
, na pergunta. Mas você pode simplesmente substituir isso.
mysql -uroot -pThatrootPassWord < alterTables.sql
funciona. E como você já observou, utf8mb4_bin é o que, entre outros, o nextcloud recomenda.