Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Copiando emojis em texto do MySQL para o SQL Server


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.