Вам не хватает N
, чтобы пометить строковый литерал как Юникод :
SELECT N'你好' AS unicode
,'你好' AS ASCII
Попробуйте это, чтобы получить base64
из ваших китайских символов и наоборот:
SELECT (SELECT CAST(N'你好' AS VARBINARY(MAX)) FOR XML PATH(''),TYPE).value(N'.','nvarchar(max)');
Вы получите base64
результат: YE99WQ ==
Это способ преобразования base64
в исходное значение
SELECT CAST(CAST('<x>' + 'YE99WQ==' + '</x>' AS XML).value('.','varbinary(max)') AS NVARCHAR(MAX));
* 1017.* ОБНОВЛЕНИЕ Несколько слов о перекодировании
base64
не кодирует строковое значение, но двоичный шаблон, который система использует для сохранения этой строки в памяти (это действительно для любого типа данных).Битовая последовательность строки отличается с UTF-8
, UTF-16
, ASCII
чем угодно ... И еще хуже, есть BE и LE.
Шаги для получения base64
:
- Получить битовую комбинацию моего значения (строку, дату, картинку, любое значение на самом деле)
- вычислить
base64
для этой битовой комбинации
Шаги для перекодирования:
- Вычисление оригинального битового шаблона, который скрыт в пределах
base64
- Интерпретироватьбитовый шаблон как оригинальное значение
Самый последний шаг может привести к путанице ... Вы должны точно знать , какое двоичное представление использует система,Вы должны использовать точно того же типа данных с точно той же интерпретацией, чтобы вернуть значения.
Со строками нужно знать, что SQL-сервер работаетс очень ограниченным исходным выбором.
- Существует
NVARCHAR
(NCHAR
), который является 2-байтовым кодированным юникодом в UCS-2
(почти так же, какutf-16
) - И есть
VARCHAR
(CHAR
), то есть 1-байтовый кодированный расширенный ASCII .Все нелатинские символы связаны с кодовой страницей в связанном сопоставлении.Но это не UTF-8!