Bắt đúng mã hóa thực sự rất khó - có quá nhiều lớp:
- Trình duyệt
- Trang
- PHP
- MySQL
Lệnh SQL "SET CHARSET utf8" từ PHP sẽ đảm bảo rằng phía máy khách (PHP) sẽ nhận được dữ liệu trong utf8, bất kể chúng được lưu trữ trong cơ sở dữ liệu như thế nào. Tất nhiên, chúng cần được lưu trữ chính xác trước tiên.
Định nghĩa DDL so với dữ liệu thực
Mã hóa được xác định cho một bảng / cột không thực sự có nghĩa là dữ liệu nằm trong bảng mã đó. Nếu bạn tình cờ có một bảng được xác định là utf8
nhưng được lưu trữ dưới dạng mã hóa khác nhau, thì MySQL sẽ coi chúng như vậy utf8
và bạn đang gặp rắc rối. Có nghĩa là bạn phải sửa lỗi này trước.
Kiểm tra những gì
Bạn cần kiểm tra xem mã hóa luồng dữ liệu ở mỗi lớp.
- Kiểm tra tiêu đề HTTP, tiêu đề.
- Kiểm tra những gì thực sự được gửi trong nội dung của yêu cầu.
- Đừng quên rằng MySQL có mã hóa hầu như ở khắp mọi nơi:
- Cơ sở dữ liệu
- Những cái bàn
- Cột
- Máy chủ nói chung
- Khách hàng
Đảm bảo rằng có một cái phù hợp ở mọi nơi.
Chuyển đổi
Nếu bạn nhận dữ liệu trong ví dụ windows-1250
, và muốn lưu trữ trong utf-8
, hãy sử dụng SQL này trước khi lưu trữ:
SET NAMES 'cp1250';
Nếu bạn có dữ liệu trong DB windows-1250
và muốn truy xuất utf8
, hãy sử dụng:
SET CHARSET 'utf8';
Thêm một số ghi chú:
- Đừng dựa vào các công cụ quá “thông minh” để hiển thị dữ liệu. Ví dụ: phpMyAdmin không (đã làm khi tôi đang sử dụng nó) mã hóa thực sự tệ. Và nó đi qua tất cả các lớp nên rất khó để tìm ra.
- Ngoài ra, Internet Explorer có hành vi thực sự ngu ngốc là "đoán" mã hóa dựa trên các quy tắc kỳ lạ.
- Sử dụng các trình chỉnh sửa đơn giản để bạn có thể chuyển đổi mã hóa. Tôi khuyên bạn nên sử dụng MySQL Workbench.