Unicode-kodepunktet for karakteren 🤘 er U+1F918 , hvilket betyder, at det er uden for Basic Multilingual Plane (BMP) af Unicode, som dækker kodepunkter op til U+FFFF.
For at behandle Unicode-tegn uden for BMP skal du anvende sammenstillinger, der understøtter supplerende tegn
, navngivet som *_SC
:
Sammenlign resultaterne af denne SQL-sætning
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
som køres mod en database ved hjælp af Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
versus en database sat til Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Hvorfor ser du "🤘
"?
UTF-8-kodningen af U+1F918 er 0xF0 0x9F 0xA4 0x98 , og tegnene er resultatet af fortolkning af disse koder som ANSI-tegn .
Hvorfor ser du "�"?
Karakteren � er Unicode UDSKIFTNINGSKARAKTER og er
og det er fordi U+D83E er ikke et gyldigt Unicode-kodepunkt , men det første ord i kodepunktet kodet som UTF-16 (0xD83E 0xDD18
).
Tjek, hvad der er gemt, ikke hvad der vises
Det kan være svært at vise Unicode-data, og den mest effektive måde at finde ud af, hvad der foregår under motorhjelmen, er at se på bytes. I TSQL skal du bruge cast(... as varbinary)
at analysere, hvor Unicode-datamanipulation går galt.