Những gì bạn có là EXTRATERRESTRIAL ALIEN (U+1F47D)
và BROKEN HEART (U+1F494)
không phải trong bình diện đa ngôn ngữ cơ bản. Chúng thậm chí không thể được biểu diễn trong java dưới dạng một ký tự, "👽💔".length() == 4
. Chúng chắc chắn không phải là các ký tự rỗng và người ta sẽ thấy các hình vuông nếu bạn không sử dụng các phông chữ hỗ trợ chúng.
utf8
của MySQL chỉ hỗ trợ mặt phẳng đa ngôn ngữ cơ bản và bạn cần sử dụng utf8mb4
thay vào đó
:
Đối với một ký tự phụ, utf8 hoàn toàn không thể lưu trữ ký tự, trong khi utf8mb4 yêu cầu bốn byte để lưu trữ. Vì utf8 hoàn toàn không thể lưu trữ ký tự, bạn không có bất kỳ ký tự bổ sung nào trong các cộtutf8 và bạn không cần lo lắng về việc chuyển đổi ký tự hoặc khóa dữ liệu khi nâng cấp dữ liệu utf8 từ các phiên bản MySQL cũ hơn.
Vì vậy, để hỗ trợ các ký tự này, MySQL của bạn cần phải là 5.5+ và bạn cần sử dụng utf8mb4
mọi nơi. Mã hóa kết nối cần phải là utf8mb4
, bộ ký tự cần phải là utf8mb4
và collaction cần phải là utf8mb4
. Đối với java, nó vẫn chỉ là "utf-8"
, nhưng MySQL cần có sự khác biệt.
Tôi không biết bạn đang sử dụng trình điều khiển nào nhưng một cách bất khả tri đối với trình điều khiển để đặt bộ ký tự kết nối là gửi truy vấn:
SET NAMES 'utf8mb4'
Ngay sau khi thực hiện kết nối.
Xem thêm phần này cho Connector / J :
14.14:Làm cách nào để sử dụng UTF8 4 byte, utf8mb4 với Connector / J?
Để sử dụng UTF8 4 byte với Connector / J, hãy cấu hình máy chủ MySQL withcharacter_set_server =utf8mb4. Sau đó Connector / J sẽ sử dụng cài đặt đó miễn là characterEncoding có không được đặt trong kết nối . Điều này tương đương với tự động phát hiện bộ ký tự.
Điều chỉnh các cột và cơ sở dữ liệu của bạn:
var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
Một lần nữa, phiên bản MySQL của bạn cần phải tương đối cập nhật để hỗ trợ utf8mb4.