sql >> Base de Datos >  >> RDS >> Mysql

Copiando emojis en texto de MySQL a SQL Server

El punto de código Unicode del personaje 🤘 es U+1F918 , lo que significa que está fuera del Plano multilingüe básico (BMP) de Unicode, que cubre puntos de código hasta U+FFFF.

Para procesar caracteres Unicode fuera de BMP, debe aplicar intercalaciones compatibles con caracteres complementarios , denominado como *_SC :

Compare los resultados de esta instrucción 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 se ejecuta contra una base de datos usando Latin1_General_CI_AS

EmojiSC EmojiSCUnicode  EmojiBinary EmojiConvBinary EmojiUnicode
NULL    129304          0x3ED818DD  0x3ED8          55358

frente a una base de datos establecida en Latin1_General_100_CI_AI_SC

EmojiSC EmojiSCUnicode  EmojiBinary EmojiConvBinary EmojiUnicode
🤘      129304          0x3ED818DD  0x3ED818DD      129304

¿Por qué ves "🤘 "?

La codificación UTF-8 de U+1F918 es 0xF0 0x9F 0xA4 0x98 , y los caracteres son el resultado de interpretar estos códigos como caracteres ANSI .

¿Por qué ves "�"?

El carácter � es el Unicode CARÁCTER DE REEMPLAZO y es

y eso se debe a que U+D83E no es un punto de código Unicode válido , pero la primera palabra del punto de código está codificada como UTF-16 (0xD83E 0xDD18 ).

Comprueba lo que está almacenado, no lo que se muestra

Mostrar datos Unicode puede ser complicado, y la forma más eficiente de averiguar qué sucede debajo del capó es mirar los bytes. En TSQL, use cast(... as varbinary) para analizar dónde falla la manipulación de datos Unicode.