Kódový bod Unicode postavy 🤘 je U+1F918 , což znamená, že je mimo základní vícejazyčnou rovinu (BMP) Unicode, který pokrývá kódové body až do U+FFFF.
Chcete-li zpracovat znaky Unicode mimo BMP, musíte použít kombinace podporující doplňkové znaky
, pojmenované jako *_SC
:
Porovnejte výsledky tohoto příkazu SQL
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
jako spuštění proti databázi pomocí Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
oproti databázi nastavené na Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Proč se vám zobrazuje „🤘
"?
Kódování UTF-8 U+1F918 je 0xF0 0x9F 0xA4 0x98 a znaky jsou výsledkem interpretace těchto kódů jako znaky ANSI .
Proč se vám zobrazuje „�“?
Znak � je Unicode NÁHRADNÍ ZNAK a je
a to proto, že U+D83E není platný kódový bod Unicode , ale první slovo kódového bodu je zakódováno jako UTF-16 (0xD83E 0xDD18
).
Zkontrolujte, co je uloženo, ne to, co se zobrazuje
Zobrazení dat Unicode může být složité a nejúčinnějším způsobem, jak zjistit, co se děje pod kapotou, je podívat se na bajty. V TSQL použijte cast(... as varbinary)
analyzovat, kde dochází k chybné manipulaci s daty Unicode.