Преобразование varbinary MSSQL в строку base64

Цель

Возьмите данные в mssql, изображение, конвертируйте в base64 и вставьте в электронное письмо.

Детс

У меня есть изображение, хранящееся в столбце varbinary в базе данных mssql.

0xFFD8FFE00....

С другой стороны, я запрашиваю его в древней среде Jython, потому что это все, к чему у меня есть доступ.

Когда я запрашиваю и печатаю, я получаю подписанный массив байтов или char (может быть?).

>>> array('b', [-1, -40, -1, -32, 0, 16,...

В другом потоке предлагалось сбросить его в кодировщик b64.

import base64
encoded = base64.b64encode(queryResult)

Что дало мне ошибку TypeError: b2a_base64(): 1st arg can't be coerced to String

В потоке также упоминалось о преобразовании его в json, но, поскольку я нахожусь в стране Python 2.4, у меня нет доступа к import json или import simplejson. Использование интерпретатора json здесь кажется мне серьезным ляпом.

Я также пытался преобразовать его на стороне SQL с помощью decompress и приведения к xml, ни один из них не работает вообще. Изображения отлично работают при передаче в качестве вложения электронной почты, поэтому, насколько я могу судить, они не повреждены. Чтобы встроить их в шаблон html, мне нужно получить эту строку Base64.

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


person Bmo    schedule 09.05.2019    source источник
comment
Для T-SQL см. stackoverflow .com/questions/45664937/.   -  person Dan Guzman    schedule 09.05.2019
comment
@Dan Guzman Я пробовал там несколько методов, но пока безуспешно. Все еще работаю над несколькими примерами. Упомянутая статья TechNet - это горячий мусор для легкого для понимания примера.   -  person Bmo    schedule 09.05.2019
comment
Этот простой пример работает для меня: SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("YourBinaryColumn")))', 'VARCHAR(MAX)') Base64EncodingData FROM dbo.YourTable;   -  person Dan Guzman    schedule 09.05.2019


Ответы (1)


Преобразование значений столбца из VARBINARY в Base64

В большинстве случаев нам нужно будет работать с несколькими строками в таблице, и мы хотим преобразовать только данные VARBINARY в строку BASE64. Основное решение такое же, как и выше, за исключением решения с использованием XML XQuery, для которого нам просто нужно использовать другой метод.

Вариант 1. Преобразуйте двоичный файл в формат Base64 с помощью JSON.

    select Id,AvatarBinary
    from openjson(
        (
            select Id,AvatarBinary
            from AriTestTbl
            for json auto
        )
    ) with(Id int, AvatarBinary varchar(max))
    GO

Вариант 2. Преобразование двоичного файла в формат Base64 с помощью XML XQuery

    select Id,
        cast('' as xml).value(
            'xs:base64Binary(sql:column("AriTestTbl.AvatarBinary"))', 'varchar(max)'
        )
    from AriTestTbl
    GO

Вариант 3. Преобразование двоичного файла в Base64 с использованием XML и подсказки "для пути xml"

    select Id,AvatarBinary,s
    from AriTestTbl
    cross apply (select AvatarBinary as '*' for xml path('')) T (s)
    GO

Надеюсь это поможет...

person Murat Yıldız    schedule 22.08.2019