Tôi có một giải pháp sẽ chuyển đổi cơ sở dữ liệu và bảng bằng cách chạy một vài lệnh. Nó cũng chuyển đổi tất cả các cột của các loại varchar
, text
, tinytext
, mediumtext
, longtext
, char
. Bạn cũng nên sao lưu cơ sở dữ liệu của mình trong trường hợp có gì đó bị hỏng.
Sao chép đoạn mã sau vào một tệp có tên là 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');
Thay thế tất cả các lần xuất hiện của "yourDbName" bằng cơ sở dữ liệu bạn muốn chuyển đổi. Sau đó chạy:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
Điều này sẽ tạo ra một tập tin mới thay đổi, với tất cả các truy vấn bạn cần để chuyển đổi cơ sở dữ liệu. Chạy lệnh sau để bắt đầu chuyển đổi:
mysql -uroot < alterTables.sql
Bạn cũng có thể điều chỉnh điều này để chạy qua nhiều cơ sở dữ liệu, bằng cách thay đổi điều kiện cho bảng_schema. Ví dụ table_schema like "wiki_%"
sẽ chuyển đổi tất cả các cơ sở dữ liệu với tiền tố tên wiki_
. Để chuyển đổi tất cả các cơ sở dữ liệu thay thế điều kiện với table_type!='SYSTEM VIEW'
.
Một vấn đề có thể phát sinh. Tôi đã có một số cột varchar (255) trong các khóa mysql. Điều này gây ra lỗi:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
Nếu điều đó xảy ra, bạn có thể chỉ cần thay đổi cột thành nhỏ hơn, như varchar (150) và chạy lại lệnh.
Xin lưu ý : Câu trả lời này chuyển đổi cơ sở dữ liệu thành utf8mb4_unicode_ci
thay vì utf8mb4_bin
, được hỏi trong câu hỏi. Nhưng bạn chỉ có thể thay thế điều này.
mysql -uroot -pThatrootPassWord < alterTables.sql
hoạt động. Và như bạn đã lưu ý, utf8mb4_bin là những gì, trong số những người khác, nextcloud khuyến nghị.