Le point de code Unicode du caractère 🤘 est U+1F918 , ce qui signifie qu'il est en dehors du Basic Multilingual Plane (BMP) d'Unicode, qui couvre les points de code jusqu'à U+FFFF.
Pour traiter les caractères Unicode en dehors du BMP, vous devez appliquer collations prenant en charge les caractères supplémentaires
, nommé *_SC
:
Comparez les résultats de cette instruction 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
exécuté sur une base de données en utilisant Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
par rapport à une base de données définie sur Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Pourquoi voyez-vous "🤘
" ?
L'encodage UTF-8 de U+1F918 est 0xF0 0x9F 0xA4 0x98 , et les caractères sont le résultat de l'interprétation de ces codes en tant que caractères ANSI .
Pourquoi voyez-vous "�" ?
Le caractère � est le CARACTÈRE DE REMPLACEMENT Unicode et est
et c'est parce que U+D83E n'est pas un point de code Unicode valide , mais le premier mot du point de code codé en UTF-16 (0xD83E 0xDD18
).
Vérifiez ce qui est stocké, pas ce qui est affiché
L'affichage des données Unicode peut être délicat, et le moyen le plus efficace de savoir ce qui se passe sous le capot est de regarder les octets. Dans TSQL, utilisez cast(... as varbinary)
pour analyser où la manipulation des données Unicode tourne mal.