Có 3 trường hợp khác nhau cần xem xét:
Các giá trị thực sự được mã hóa bằng Latin1
Đây là trường hợp nhất quán:bộ mã được khai báo và mã hóa nội dung khớp nhau. Đây là trường hợp duy nhất tôi đề cập trong câu trả lời đầu tiên của mình.
Sử dụng lệnh bạn đã đề xuất:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Lưu ý rằng CONVERT TO CHARACTER SET
lệnh chỉ xuất hiện trong MySQL 4.1.2, vì vậy bất kỳ ai sử dụng cơ sở dữ liệu được cài đặt trước năm 2005 đều phải sử dụng thủ thuật xuất / nhập. Đây là lý do tại sao có rất nhiều tập lệnh và tài liệu kế thừa trên Internet làm theo cách cũ.
Các giá trị đã được mã hóa bằng utf8
Trong trường hợp này, bạn không muốn mysql chuyển đổi bất kỳ dữ liệu nào, bạn chỉ cần thay đổi siêu dữ liệu của cột.
Đối với điều này, trước tiên bạn phải thay đổi loại thành BLOB, sau đó thành TEXT utf8 cho mỗi cột, để không có chuyển đổi giá trị:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Đây là cách được khuyến nghị và nó được ghi lại rõ ràng trong Alter Tài liệu về cú pháp bảng .
Các giá trị sử dụng trong một mã hóa khác
Mã hóa mặc định là Latin1 trong vài năm trên một số bản phân phối Linux. Trong trường hợp này, bạn phải sử dụng kết hợp hai kỹ thuật:
- Sửa siêu dữ liệu bảng bằng thủ thuật loại BLOB
- Chuyển đổi các giá trị bằng cách sử dụng
CONVERT TO
.