7.6.26

Новое в SQL Server 2025: функции кодирования и декодирования Base64

Автор: Leonard Lobel, Base64 Encoding and Decoding in SQL Server 2025 and Azure SQL Database

SQL Server 2025 добавляет встроенную поддержку кодирования и декодирования Base64 с помощью двух T-SQL-функций: BASE64_ENCODE и BASE64_DECODE. Эти функции значительно упрощают преобразование двоичных данных в дружественные к тексту представления и обратное преобразование строк в двоичные данные, когда это необходимо.

Это полезно во многих повседневных сценариях: встраивание двоичного содержимого в JSON, создание URL данных для HTML, передача двоичных полезных нагрузок через текстовые протоколы и создание безопасных для URL токенов. Раньше разработчикам часто приходилось полагаться на XML-трюки, код на стороне приложения, CLR-функции или собственную логику преобразования. Теперь эта функциональность доступна непосредственно в T-SQL.

Важно: Base64 — это формат кодирования, а не механизм шифрования. Он делает двоичные данные дружественными к тексту, но не обеспечивает безопасность или скрытие основных данных.

Полный демонстрационный скрипт

Вот полный код демонстрации, использованный в этой статье.

-- Кодирование Base64 — это метод преобразования двоичных данных в строковый формат ASCII -- путём перевода их в представление с основанием 64. Декодирование Base64 — обратный процесс. -- Кодирование часто используется для безопасной передачи двоичных данных через текстовые протоколы. SELECT StandardEncoded = BASE64_ENCODE(0xCAFECAFE) -- / в закодированной строке; небезопасно для URL SELECT StandardDecoded = BASE64_DECODE('yv7K/g==') -- Декодируется обратно в 0xCAFECAFE SELECT UrlSafeEncoded = BASE64_ENCODE(0xCAFECAFE, 1) -- Строка безопасна для URL SELECT UrlSafeDecoded = BASE64_DECODE('yv7K_g') -- Оба варианта декодируются в одни и те же двоичные данные SELECT InvalidBase64 = BASE64_DECODE('qQ!!') -- Вызывает ошибку из-за недопустимых символов Base64 -- Построение JSON-объекта со встроенным изображением (также подходит для HTML или XML) DECLARE @ProductId int = 6 DECLARE @ProductImage varbinary(max) = 0xCAFECAFE89504E470D0A1A0A0000000D49484452 SELECT ProductJson = JSON_OBJECT( 'productId' : @ProductId, 'thumbnail' : 'data:image/png;base64,' || BASE64_ENCODE(@ProductImage) ) GO -- Построение двоичного токена для использования в URL DECLARE @Token varbinary(max) = CAST('user1|expiry=2025-12-31' as varbinary) SELECT @Token DECLARE @UrlSafeEncodedToken varchar(max) = BASE64_ENCODE(@Token, 1) SELECT @UrlSafeEncodedToken DECLARE @Url varchar(max) = 'https://api.myapp.com/download?token=' || @UrlSafeEncodedToken SELECT @Url

Что делает BASE64_ENCODE

BASE64_ENCODE преобразует значение типа varbinary в значение varchar, закодированное в Base64. Другими словами, он берёт двоичные данные и превращает их в строку, которая может безопасно передаваться через системы, ожидающие текст.

SELECT StandardEncoded = BASE64_ENCODE(0xCAFECAFE) -- Результат: yv7K/g==

Обратите внимание, что закодированная строка включает косую черту (/) и символы заполнения (==). Это стандартный вывод Base64.

Что делает BASE64_DECODE

BASE64_DECODE выполняет обратную операцию. Он принимает строку varchar, закодированную в Base64, и преобразует её обратно в соответствующее значение varbinary.

SELECT StandardDecoded = BASE64_DECODE('yv7K/g==') -- Результат: 0xCAFECAFE

URL-безопасное кодирование Base64

Стандартный вывод Base64 может включать такие символы, как +, / и =. Эти символы могут быть неудобны в URL, поскольку могут требовать экранирования или иметь специальное значение в зависимости от того, где они появляются.

Необязательный второй аргумент BASE64_ENCODE управляет тем, должен ли SQL Server генерировать URL-безопасный вывод.

SELECT UrlSafeEncoded = BASE64_ENCODE(0xCAFECAFE, 1) -- Результат: yv7K_g

В этой версии косая черта заменена символом подчёркивания, а символы заполнения опущены. Это делает закодированное значение гораздо более удобным для использования в URL.

Декодирование URL-безопасного Base64

BASE64_DECODE может декодировать как стандартные строки Base64, так и URL-безопасные строки Base64.

SELECT UrlSafeDecoded = BASE64_DECODE('yv7K_g') -- Результат: 0xCAFECAFE

И yv7K/g==, и yv7K_g декодируются в одно и то же двоичное значение.

Недопустимые входные данные Base64

Недопустимые входные данные вызывают ошибку. Это полезно, поскольку предотвращает незаметное получение неверных двоичных данных из неправильно сформированных закодированных строк.

SELECT InvalidBase64 = BASE64_DECODE('qQ!!') -- Msg 9803, Level 16, State 20 -- Invalid data for type "Base64Decode".

Встраивание двоичных данных в JSON

Один из очень практичных случаев использования — встраивание двоичных данных в JSON. Это распространено при отправке изображений, миниатюр, документов или других двоичных полезных нагрузок через API.

DECLARE @ProductId int = 6 DECLARE @ProductImage varbinary(max) = 0xCAFECAFE89504E470D0A1A0A0000000D49484452 SELECT ProductJson = JSON_OBJECT( 'productId' : @ProductId, 'thumbnail' : 'data:image/png;base64,' || BASE64_ENCODE(@ProductImage) ) -- Результат: {"productId":6,"thumbnail":"data:image/png;base64,yv7K/olQTkcNChoKAAAADUlIRFI="}

Свойство thumbnail содержит префикс data:image/png;base64,, за которым следуют закодированные в Base64 двоичные данные изображения. Этот же общий метод может использоваться с HTML или XML, а не только с JSON.

Кодирование Base64 увеличивает размер закодированных данных примерно на одну треть, поэтому это удобно, но не бесплатно. Для больших двоичных полезных нагрузок может быть лучше хранить двоичные данные отдельно и ссылаться на них по URL или идентификатору.

Создание безопасного для URL двоичного токена

Другой распространённый сценарий — создание токена, который необходимо включить в URL. Токен начинается как двоичные данные, кодируется в URL-безопасный Base64, а затем добавляется к строке запроса.

DECLARE @Token varbinary(max) = CAST('user1|expiry=2025-12-31' as varbinary) SELECT @Token -- Результат: 0x75736572317C6578706972793D323032352D31322D3331 DECLARE @UrlSafeEncodedToken varchar(max) = BASE64_ENCODE(@Token, 1) SELECT @UrlSafeEncodedToken -- Результат: dXNlcjF8ZXhwaXJ5PTIwMjUtMTItMzE DECLARE @Url varchar(max) = 'https://api.myapp.com/download?token=' || @UrlSafeEncodedToken SELECT @Url -- Результат: https://api.myapp.com/download?token=dXNlcjF8ZXhwaXJ5PTIwMjUtMTItMzE

Это гораздо безопаснее для URL, чем использование стандартного вывода Base64, поскольку URL-безопасная форма избегает символов, которые обычно требуют экранирования в строках запроса.

Резюме

Новые функции BASE64_ENCODE и BASE64_DECODE — это небольшие дополнения, которые решают очень практическую проблему. Они позволяют легко преобразовывать двоичные значения в переносимый текст и обратно, непосредственно в T-SQL.

Используйте стандартный Base64, когда вам нужно обычное закодированное представление, и используйте URL-безопасный Base64, когда закодированное значение будет появляться в URL, токене, сегменте пути или строке запроса. Просто помните, что Base64 — это не шифрование и что кодирование увеличивает размер данных.




Комментариев нет:

Отправить комментарий