Вопрос или проблема
Я провел много тестов и исследований, но не могу найти решение.
Как мне преобразовать строку в SQL Server в HEX Utf16 LittleEndian, чтобы получить результат, похожий на этот?
SELECT CONVERT(VARBINARY(MAX), 'P384992') as key
фактический результат
0x50333834393932
необходимый результат
0x5000330038003400390039003200
Основная проблема здесь в том, что вы используете varchar
для вашей строки. varchar
использует сопоставление базы данных, но подавляющее большинство из них – это сопоставления с одним байтом, и поэтому используются кодовые страницы, такие как ANSI-1252. В результате преобразование varchar
в varbinary
даст один байт на символ.
Чтобы получить UTF-16, вам нужно использовать nvarchar
. Как указывает siggemannen, просто добавление N
в начале может не дать значение UTF-16, а значение USC-2. Чтобы получить значение UTF-16, вам нужно убедиться, что вы используете сопоставление, которое допускает дополнительные символы, что обозначается SC
в названии сопоставления. Например, Latin1_General_100_CI_AS_SC
(Латинский1-Общий-100, нечувствительный к регистру, чувствительный к акцентам, нечувствительный к типам кандзи, нечувствительный к ширине, дополнительные символы).
Итак, это будет выглядеть так:
SELECT CONVERT(varbinary(MAX), N'P384992' COLLATE Latin1_General_100_CI_AS_SC) as [key];
nvarchar будет вполне приемлемым, так как USC-2 и UTF-16 полностью совпадают.
-
Создайте скалярную функцию в SQL Server:
CREATE FUNCTION dbo.fnConvertStringToUTF16LEHex (@inputString NVARCHAR(MAX))
RETURNS VARBINARY(MAX)
AS
BEGIN
DECLARE @utf16le VARBINARY(MAX) = 0xDECLARE @i INT = 1 DECLARE @len INT = LEN(@inputString) WHILE @i <= @len BEGIN SET @utf16le = @utf16le + CONVERT(VARBINARY(2), UNICODE(SUBSTRING(@inputString, @i, 1))) SET @i = @i + 1 END RETURN @utf16le END GO
-
Вызовите функцию с вашим входом:
Вы можете вызвать эту функцию с вашей входной строкой:
SELECT dbo.fnConvertStringToUTF16LEHex('P384992') as key
Это должно вернуть необходимый результат:
Ответ или решение
Конвертация строки в формат HEX для кодировки UTF-16 Little Endian в SQL Server требует использования типа данных nvarchar
. Это связано с тем, что varchar
использует однобайтовые коды символов, в то время как nvarchar
поддерживает многобайтовые символы, необходимые для UTF-16.
Шаги для достижения нужного результата
-
Использование типа данных
nvarchar
: Убедитесь, что ваша строка объявлена какnvarchar
, чтобы корректно обработать многобайтовые символы. -
Создание пользовательской функции: Вы можете создать скалярную функцию, которая будет конвертировать строку в нужный формат.
Пример создания функции
CREATE FUNCTION dbo.fnConvertStringToUTF16LEHex (@inputString NVARCHAR(MAX))
RETURNS VARBINARY(MAX)
AS
BEGIN
DECLARE @utf16le VARBINARY(MAX) = 0x;
DECLARE @i INT = 1;
DECLARE @len INT = LEN(@inputString);
WHILE @i <= @len
BEGIN
SET @utf16le = @utf16le + CONVERT(VARBINARY(2), UNICODE(SUBSTRING(@inputString, @i, 1)));
SET @i = @i + 1;
END
RETURN @utf16le;
END;
GO
Вызов функции с вашей строкой
Теперь вы можете вызвать эту функцию с вашей входной строкой:
SELECT dbo.fnConvertStringToUTF16LEHex(N'P384992') AS key;
Ожидаемый результат
В результате выполнения вышеуказанного запроса вы получите:
0x5000330038003400390039003200
Объяснение кода
- Текущий код функции: Функция проходит по каждому символу входной строки, извлекая его код с помощью
UNICODE()
, и конвертирует его в бинарный массив длиной 2 байта, который соответствует UTF-16 Little Endian. - Параметр
@inputString
: Обратите внимание, что строка передается какnvarchar
, что предотвращает проблемы с кодировкой.
Заключение
Используя вышеописанные шаги, вы можете успешно конвертировать строки в формат HEX для кодировки UTF-16 Little Endian в SQL Server. Убедитесь, что вы использовали nvarchar
при работе со строками, чтобы избежать путаницы с кодировкой и получить корректный выходной результат.