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_ci
alih-alih utf8mb4_bin
, ditanyakan dalam pertanyaan. Tetapi Anda bisa langsung mengganti ini.
mysql -uroot -pThatrootPassWord < alterTables.sql
berfungsi. Dan seperti yang sudah Anda catat, utf8mb4_bin adalah apa yang direkomendasikan oleh nextcloud.