Titik kode Unicode dari karakter adalah U+1F918 , yang berarti berada di luar Pesawat Multibahasa Dasar (BMP) Unicode, yang mencakup codepoint hingga U+FFFF.
Untuk memproses karakter Unicode di luar BMP, Anda perlu menerapkan kolasi yang mendukung Karakter Tambahan
, bernama *_SC
:
Bandingkan hasil pernyataan SQL ini
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
sebagai dijalankan terhadap database menggunakan Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
versus basis data yang disetel ke Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Mengapa Anda melihat "🤘
"?
Encoding UTF-8 U+1F918 adalah 0xF0 0x9F 0xA4 0x98 , dan karakter tersebut adalah hasil dari interpretasi kode ini sebagai karakter ANSI .
Mengapa Anda melihat "�"?
Karakter � adalah Unicode KARAKTER PENGGANTIAN dan adalah
dan itu karena U+D83E bukan codepoint Unicode yang valid , tetapi kata pertama dari codepoint yang dikodekan sebagai UTF-16 (0xD83E 0xDD18
).
Periksa apa yang disimpan, bukan apa yang ditampilkan
Menampilkan data Unicode bisa jadi rumit, dan cara paling efisien untuk mengetahui apa yang terjadi adalah dengan melihat byte. Di TSQL, gunakan cast(... as varbinary)
untuk menganalisis kesalahan manipulasi data Unicode.