У меня есть решение, которое преобразует базы данных и таблицы, выполнив несколько команд. Он также преобразует все столбцы типа varchar
, text
, tinytext
, mediumtext
, longtext
, char
. Вы также должны сделать резервную копию базы данных на случай, если что-то сломается.
Скопируйте следующий код в файл с именем 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');
Замените все вхождения yourDbName на базу данных, которую вы хотите преобразовать. Затем запустите:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Это сгенерирует новый файл alterTables.sql со всеми запросами, необходимыми для преобразования базы данных. Запустите следующую команду, чтобы начать преобразование:
mysql -uroot < alterTables.sql
Вы также можете настроить это для работы с несколькими базами данных, изменив условие для table_schema. Например table_schema like "wiki_%"
, преобразует все базы данных с префиксом имени wiki_
. Для преобразования всех баз данных замените условие на table_type!='SYSTEM VIEW'
.
Проблема, которая может возникнуть. У меня было несколько столбцов varchar (255) в ключах mysql. Это вызывает ошибку:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Если это произойдет, вы можете просто изменить столбец на меньший, например, varchar (150), и снова запустить команду.
Обратите внимание : этот ответ преобразует базу данных utf8mb4_unicode_ci
вместо того utf8mb4_bin
, что задано в вопросе. Но вы можете просто заменить это.
mysql -uroot -pThatrootPassWord < alterTables.sql
работает. И, как вы уже заметили, utf8mb4_bin - это то, что, помимо прочего, рекомендует nextcloud.