Sử dụng mysqli_set_charset
để thay đổi mã hóa ứng dụng khách thành UTF-8 ngay sau khi bạn kết nối:
$mysqli->set_charset("utf8");
Mã hóa ứng dụng khách là những gì MySql mong đợi đầu vào của bạn ở trong (ví dụ:khi bạn chèn văn bản do người dùng cung cấp vào truy vấn tìm kiếm) và những gì nó cung cấp cho bạn kết quả (vì vậy nó phải khớp với mã hóa đầu ra của bạn để tạo ra echo
để hiển thị mọi thứ một cách chính xác).
Bạn cần có nó khớp với mã hóa của trang web của bạn để giải thích cho hai trường hợp ở trên và mã hóa của tệp nguồn PHP (để các phần được mã hóa cứng trong các truy vấn của bạn được diễn giải chính xác).
Cập nhật:Cách chuyển đổi dữ liệu được chèn bằng latin-1 thành utf-8
Đối với dữ liệu đã được chèn bằng cách sử dụng mã hóa kết nối sai, có một giải pháp thuận tiện để khắc phục sự cố. Đối với mỗi cột chứa loại dữ liệu này, bạn cần thực hiện:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
Phần giữ chỗ table_name
, column_name
và existing_column_type
nên được thay thế bằng các giá trị chính xác từ cơ sở dữ liệu của bạn mỗi lần.
Điều này có nghĩa là gì
- Cho MySql biết rằng nó cần lưu trữ dữ liệu trong cột đó bằng latin1. Bộ ký tự này chỉ chứa một tập hợp con nhỏ của utf8 nên nói chung việc chuyển đổi này liên quan đến việc mất dữ liệu, nhưng trong trường hợp cụ thể này, dữ liệu đã được hiểu là latin1 trên đầu vào nên sẽ không có tác dụng phụ. Tuy nhiên, MySql sẽ chuyển đổi nội bộ biểu diễn byte dữ liệu của bạn để khớp với những gì ban đầu được gửi từ PHP.
- Chuyển đổi cột thành kiểu nhị phân (
BLOB
) không có thông tin mã hóa liên quan. Tại thời điểm này, cột sẽ chứa các byte thô là một chuỗi ký tự utf8 thích hợp. - Chuyển đổi cột về kiểu ký tự trước đó của nó, cho MySql biết rằng các byte thô nên được coi là ở mã hóa utf8.
CẢNH BÁO:Bạn chỉ có thể sử dụng cách tiếp cận bừa bãi này nếu cột được đề cập chứa chỉ dữ liệu được chèn không chính xác. Bất kỳ dữ liệu nào đã được chèn chính xác sẽ bị cắt ngắn ở lần xuất hiện đầu tiên của bất kỳ ký tự không phải ASCII nào!
Do đó, bạn nên làm điều đó ngay bây giờ, trước khi bản sửa lỗi bên PHP có hiệu lực.