Saya punya solusi yang akan mengonversi basis data dan tabel dengan menjalankan beberapa perintah. Hal ini juga mengkonversi semua kolom jenis varchar, text, tinytext, mediumtext, longtext, char. Anda juga harus mencadangkan basis data jika terjadi kerusakan.
Salin kode berikut ke file yang bernama 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');
Ganti semua kemunculan "yourDbName" dengan database yang ingin Anda konversi. Lalu lari:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Ini akan menghasilkan file baru alterTables.sql, dengan semua pertanyaan yang Anda butuhkan untuk mengonversi database. Jalankan perintah berikut untuk memulai konversi:
mysql -uroot < alterTables.sql
Anda juga dapat mengadaptasi ini untuk dijalankan melalui banyak basis data, dengan mengubah kondisi untuk table_schema. Misalnya table_schema like "wiki_%"akan mengonversi semua basis data dengan nama awalan wiki_. Untuk mengonversi semua basis data, ganti kondisinya dengan table_type!='SYSTEM VIEW'.
Suatu masalah yang mungkin muncul. Saya memiliki beberapa kolom varchar (255) di kunci mysql. Ini menyebabkan kesalahan:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Jika itu terjadi, Anda cukup mengubah kolom menjadi lebih kecil, seperti varchar (150), dan jalankan kembali perintah.
Harap dicatat : Jawaban ini mengubah database menjadi utf8mb4_unicode_cialih-alih utf8mb4_bin, ditanyakan dalam pertanyaan. Tetapi Anda bisa langsung mengganti ini.
mysql -uroot -pThatrootPassWord < alterTables.sqlberfungsi. Dan seperti yang sudah Anda catat, utf8mb4_bin adalah apa yang direkomendasikan oleh nextcloud.