Birkaç komut çalıştırarak veritabanlarını ve tabloları dönüştürecek bir çözüme sahibim. Ayrıca türdeki tüm sütunları dönüştürür varchar, text, tinytext, mediumtext, longtext, char. Ayrıca , bir şey bozulursa veritabanınızı da yedeklemelisiniz .
Aşağıdaki kodu preAlterTables.sql adlı bir dosyaya kopyalayın:
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" öğesinin tüm oluşumlarını dönüştürmek istediğiniz veritabanı ile değiştirin. O zaman koş:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Bu, veritabanını dönüştürmek için ihtiyacınız olan tüm sorgularla birlikte alterTables.sql dosyasını oluşturur. Dönüştürmeyi başlatmak için aşağıdaki komutu çalıştırın:
mysql -uroot < alterTables.sql
Bunu ayrıca table_schema koşulunu değiştirerek birden fazla veritabanında çalışacak şekilde uyarlayabilirsiniz. Örneğin table_schema like "wiki_%", tüm veritabanlarını ad öneki ile dönüştürür wiki_. Tüm veritabanlarını dönüştürmek için koşulu ile değiştirin table_type!='SYSTEM VIEW'.
Ortaya çıkabilecek bir sorun. MySQL anahtarlarında bazı varchar (255) sütunlar vardı. Bu bir hataya neden olur:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Bu durumda, sütunu varchar (150) gibi daha küçük olacak şekilde değiştirebilir ve komutu yeniden çalıştırabilirsiniz.
Lütfen dikkat : Bu cevap , sorulan soru utf8mb4_unicode_ciyerine veritabanını dönüştürür utf8mb4_bin. Ancak bunu basitçe değiştirebilirsiniz.
mysql -uroot -pThatrootPassWord < alterTables.sqlçalışır. Daha önce de belirtildiği gibi utf8mb4_bin, diğerlerinin yanı sıra nextcloud'un önerdiği şey.