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_ci
yerine 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.