Kodem Unicode znaku 🤘 jest U+1F918 , co oznacza, że znajduje się poza Podstawową płaszczyzną wielojęzyczną (BMP) Unicode, który obejmuje punkty kodowe do U+FFFF.
Aby przetwarzać znaki Unicode poza BMP, musisz zastosować kolacje obsługujące znaki uzupełniające
, nazwany jako *_SC
:
Porównaj wyniki tego polecenia 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
jak uruchomić w bazie danych przy użyciu Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
w porównaniu z bazą danych ustawioną na Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Dlaczego widzisz „🤘
„?
Kodowanie UTF-8 U+1F918 to 0xF0 0x9F 0xA4 0x98 , a znaki są wynikiem interpretacji tych kodów jako znaki ANSI .
Dlaczego widzisz „�”?
Znak � to ZAMIENNIK i jest
a to dlatego, że U+D83E nie jest prawidłowym punktem kodowym Unicode , ale pierwsze słowo punktu kodowego zakodowane jako UTF-16 (0xD83E 0xDD18
).
Sprawdź, co jest przechowywane, a nie wyświetlane
Wyświetlanie danych Unicode może być trudne, a najskuteczniejszym sposobem sprawdzenia, co się dzieje pod maską, jest spojrzenie na bajty. W TSQL użyj cast(... as varbinary)
analizować, gdzie manipulacja danymi Unicode idzie nie tak.