Tóm lại, vì điều này đã được thảo luận hàng nghìn lần trước đây:
- PHP giữ một chuỗi, nói
"漢字"
, được mã hóa bằng UTF-8. Các byte cho điều này làE6 BC A2 E5 AD 97
. - Nó gửi chuỗi này qua kết nối cơ sở dữ liệu được đặt thành
latin1
. - Cơ sở dữ liệu nhận các byte
E6 BC A2 E5 AD 97
, nghĩ rằng chúng đại diện cholatin1
ký tự. - Cơ sở dữ liệu lưu trữ các ký tự
æ¼¢å
(các ký tựE6 BC A2 E5 AD 97
ánh xạ tới bằnglatin1
). - Quá trình tương tự được đảo ngược làm cho PHP nhận được các byte giống nhau, sau đó nó được coi là UTF-8. Roundtrip hoạt động tốt đối với PHP, mặc dù cơ sở dữ liệu không xử lý các ký tự như bình thường.
Vì vậy, vấn đề ở đây là kết nối cơ sở dữ liệu đã được đặt không chính xác khi dữ liệu được nhập vào cơ sở dữ liệu. Bạn sẽ phải chuyển đổi dữ liệu trong cơ sở dữ liệu sang các ký tự chính xác. Hãy thử điều này:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Có thể utf8
không phải là những gì bạn cần ở đây, hãy thử nghiệm. Nếu điều đó hoạt động, hãy thay đổi điều này thành UPDATE
để cập nhật dữ liệu vĩnh viễn.