Tin xấu. Nhưng trước tiên, hãy kiểm tra kỹ:
SELECT col, HEX(col)...
để xem những gì có trong bảng. Nếu hệ lục phân hiển thị 3F
, sau đó dữ liệu đã biến mất. Được lưu trữ chính xác, dal
ký tự phải là hex D8AF
; hah
là hex D8AD
.
Điều gì đã xảy ra:
- bạn có dữ liệu được mã hóa utf8 (tốt)
-
SET NAMES latin1
đã có hiệu lực (mặc định, nhưng sai) - cột đã được khai báo
CHARACTER SET latin1
(mặc định, nhưng sai)
Khi bạn INSERTed
dữ liệu, nó đã được chuyển đổi thành latin1, không có giá trị cho các ký tự tiếng Farsi, vì vậy dấu chấm hỏi đã thay thế chúng.
Cách chữa (cho `INSERTs trong tương lai):
- Mã hóa ứng dụng của bạn bằng giao diện mysqli_ * thay vì giao diện mysql_ * không dùng nữa.
- dữ liệu được mã hóa utf8 (tốt)
- mysqli_set_charset ('utf8')
- kiểm tra xem (các) cột và / hoặc mặc định của bảng có phải là
CHARACTER SET utf8
không - Nếu bạn đang hiển thị trên một trang web,
<meta...utf8>
phải ở gần đầu.
Phần thảo luận ở trên là về CHARACTER SET
, bảng mã của các ký tự. Bây giờ để biết mẹo về COLLATION
, được sử dụng để so sánh và sắp xếp.
Nếu bạn muốn chúng được đối xử bình đẳng:'بِسْمِ' ='بسم', thì hãy sử dụng utf8_unicode_ci (thay vì utf8_general_ci) cho COLLATION
.