У мене є рішення, яке перетворить бази даних і таблиці, виконавши кілька команд. Він також перетворює всі стовпці типу 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
Ви також можете пристосувати це для запуску через декілька баз даних, змінивши умову таблиці_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.