O codepoint Unicode do caractere 🤘 é U+1F918 , o que significa que está fora do Plano Multilíngue Básico (BMP) de Unicode, que cobre codepoints até U+FFFF.
Para processar caracteres Unicode fora do BMP, você precisa aplicar agrupamentos que suportam caracteres suplementares , nomeado como *
_SC
:Compare os resultados desta instrução 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
como executado em um banco de dados usando
Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
versus um banco de dados definido como
Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Por que você vê "
🤘
"? A codificação UTF-8 de U+1F918 é 0xF0 0x9F 0xA4 0x98 , e os caracteres são o resultado da interpretação desses códigos como caracteres ANSI .
Por que você vê "�"?
O caractere � é o Unicode CARACTER DE SUBSTITUIÇÃO e é
e isso ocorre porque U+D83E não é um codepoint Unicode válido , mas a primeira palavra do codepoint codificada como UTF-16 (
0xD83E 0xDD18
). Verifique o que está armazenado, não o que é exibido
Exibir dados Unicode pode ser complicado, e a maneira mais eficiente de descobrir o que está acontecendo nos bastidores é observar os bytes. Em TSQL, use
cast(... as varbinary)
para analisar onde a manipulação de dados Unicode dá errado.