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.