Dấu chấm hỏi xuất phát từ điều này:
- Khách hàng có một nhân vật hợp lệ (tốt) và
-
SET NAMESđồng ý với cách mã hóa mà khách hàng có (tốt), nhưng -
CHARACTER SETcủa cột mục tiêu không bao gồm nhân vật dự định (xấu).
Ví dụ:
-
latin1chỉ xử lý các ký tự Tây Âu; Cố gắng đặt một ký tự Đông Âu hoặc bất kỳ ký tự châu Á nào sẽ không phù hợp. -
latin2vàcp1250có thể xử lý tiếng Séc, vì vậy việc chuyển đổi giữa chúng hầu như là OK, nhưng không phải giữa chúng vàlatin1 -
utf8mb4là một tập hợp siêu củautf8. Chèn một ký tự utf8 vào utf8mb4 là được, nhưng kết quả đảo ngược lại tạo ra dấu '?' trong một số trường hợp.
Các ký tự đã được chuyển đổi thành '?' không thể khôi phục từ bảng.
Cách sửa INSERTs trong tương lai ?
- Sử dụng
utf8mb4trên (các) cột trong bảng có thể hoạt động trong mọi trường hợp. - Nếu không, hãy chọn một số
CHARACTER SETcho (các) cột trong bảng khớp hợp lý với dữ liệu khách hàng.
Lý do chỉ một số ký tự là ? (trong š?ž?? ) là vì šž tồn tại bằng tiếng latin1 nhưng những cái khác thì không.
Điểm mấu chốt:Thay đổi CHARACTER SET trong định nghĩa bảng.