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 SET
của cột mục tiêu không bao gồm nhân vật dự định (xấu).
Ví dụ:
-
latin1
chỉ 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. -
latin2
vàcp1250
có 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
-
utf8mb4
là 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
utf8mb4
trê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 SET
cho (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.