Điểm mã Unicode của ký tự 🤘 là U + 1F918 , có nghĩa là nó nằm ngoài Mặt phẳng đa ngôn ngữ cơ bản (BMP) của Unicode, bao gồm các điểm mã lên đến U + FFFF.
Để xử lý các ký tự Unicode bên ngoài BMP, bạn cần áp dụng ảnh ghép hỗ trợ các ký tự bổ sung
, được đặt tên là * _SC
:
So sánh kết quả của câu lệnh SQL này
select
nchar(unicode(N'🤘' collate Latin1_General_100_CI_AS_SC)) as EmojiSC,
unicode(N'🤘' collate Latin1_General_100_CI_AS_SC) as EmojiSCUnicode,
cast(N'🤘' as varbinary) as EmojiBinary,
cast(nchar(unicode(N'🤘')) as varbinary) as EmojiConvBinary,
unicode(N'🤘') as EmojiUnicode
như chạy trên cơ sở dữ liệu bằng Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
so với cơ sở dữ liệu được đặt thành Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Tại sao bạn thấy "🤘
"?
Mã hóa UTF-8 của U + 1F918 là 0xF0 0x9F 0xA4 0x98 và các ký tự là kết quả của việc diễn giải các mã này là ký tự ANSI .
Tại sao bạn thấy "�"?
Ký tự � là Unicode KÝ TỰ THAY THẾ và là
và đó là vì U + D83E không phải là điểm mã Unicode hợp lệ , nhưng từ đầu tiên của điểm mã được mã hóa là UTF-16 (0xD83E 0xDD18
).
Kiểm tra những gì được lưu trữ, không phải những gì được hiển thị
Việc hiển thị dữ liệu Unicode có thể phức tạp và cách hiệu quả nhất để tìm hiểu những gì đang diễn ra là xem xét các byte. Trong TSQL, sử dụng cast(... as varbinary)
để phân tích nơi thao tác dữ liệu Unicode bị sai.