Cách an toàn nhất là sửa đổi các cột trước thành loại nhị phân và sau đó sửa đổi lại thành loại bằng cách sử dụng bộ ký tự mong muốn.
Mỗi loại cột có loại nhị phân tương ứng, như sau:
- CHAR => BINary
- VĂN => BLOB
- TINYTEXT => TINYBLOB
- TRUNG TÂM => MEDIUMBLOB
- LONGTEXT => LONGBLOB
- VARCHAR => BIỂU TƯỢNG
Ví dụ.:
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;
Tôi đã thử trong một số bảng latin1 và nó giữ tất cả các dấu phụ.
Bạn có thể trích xuất truy vấn này cho tất cả các cột thực hiện việc này:
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');
Sau khi bạn làm điều này trên tất cả các cột của bạn, sau đó bạn làm điều đó trên tất cả các bảng:
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Để tạo truy vấn này cho tất cả các bảng của bạn, hãy sử dụng truy vấn sau:
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');
Và bây giờ bạn đã sửa đổi tất cả các cột và bảng của mình, hãy làm tương tự trên cơ sở dữ liệu:
ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
utf8_unicode_ci
, khôngutf8_general_ci
.