Автор: 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 — это не шифрование и что кодирование увеличивает размер данных.

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