Кодовата точка на Unicode на знака 🤘 е U+1F918 , което означава, че е извън Основна многоезична равнина (BMP) на Unicode, който покрива кодови точки до U+FFFF.
За да обработвате Unicode знаци извън BMP, трябва да приложите колации, поддържащи допълнителни знаци
, именуван като *_SC
:
Сравнете резултатите от този 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
като стартиране срещу база данни с помощта на Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
спрямо база данни, зададена на Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Защо виждате „ðŸ¤˜
“?
UTF-8 кодирането на U+1F918 е 0xF0 0x9F 0xA4 0x98 , а знаците са резултат от тълкуването на тези кодове като ANSI знаци .
Защо виждате „�“?
Символът � е ЗАМЕСТОЯЩ ЗНАК от Unicode и е
и това е така, защото U+D83E е не е валидна Unicode кодова точка , но първата дума от кодовата точка, кодирана като UTF-16 (0xD83E 0xDD18
).
Проверете какво се съхранява, а не какво се показва
Показването на Unicode данни може да бъде трудно и най-ефективният начин да разберете какво се случва под капака е да погледнете байтовете. В TSQL използвайте cast(... as varbinary)
за да анализирате къде манипулирането на Unicode данни се обърка.