SQL Server + конвертировать текст в HEX UTF16 Little Endian

Вопрос или проблема

Я провел много тестов и исследований, но не могу найти решение.

Как мне преобразовать строку в 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 полностью совпадают.

  1. Создайте скалярную функцию в SQL Server:

    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
    
  2. Вызовите функцию с вашим входом:
    Вы можете вызвать эту функцию с вашей входной строкой:

SELECT dbo.fnConvertStringToUTF16LEHex('P384992') as key

Это должно вернуть необходимый результат:

Ответ или решение

Конвертация строки в формат HEX для кодировки UTF-16 Little Endian в SQL Server требует использования типа данных nvarchar. Это связано с тем, что varchar использует однобайтовые коды символов, в то время как nvarchar поддерживает многобайтовые символы, необходимые для UTF-16.

Шаги для достижения нужного результата

  1. Использование типа данных nvarchar: Убедитесь, что ваша строка объявлена как nvarchar, чтобы корректно обработать многобайтовые символы.

  2. Создание пользовательской функции: Вы можете создать скалярную функцию, которая будет конвертировать строку в нужный формат.

Пример создания функции

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 при работе со строками, чтобы избежать путаницы с кодировкой и получить корректный выходной результат.

Оцените материал
Добавить комментарий

Капча загружается...