Поля байта HDBC-postgreSQL возвращаются в виде шестнадцатеричных строк SqlByteString

Когда я выбираю bytea поля, заполненные двоичными данными в моей базе данных Postgres с использованием драйвера HDBC-postgreSQL (версия 2.3.2.3), они выглядят так:

SqlByteString "\x<hex representation of binary data>"

То есть возвращает ByteString которая содержит строку, содержащую \x с последующим шестнадцатеричным представлением моих двоичных данных. Это неудобно, ужасно неэффективно и в принципе не имеет смысла для меня.

Есть ли причина, по которой он не возвращает SqlByteString содержит байтовую строку с фактическими двоичными данными внутри нее? Что-то мне не хватает, или как мне настроить драйвер для этого?

Спасибо

2 ответа

Решение

Это давно известная проблема с этой библиотекой. Смотрите эту ошибку, например.

Более широкая проблема заключается в том, что получение необработанных байтов требует достаточного количества хитрости, которую postgres api не делает очевидным. Вы должны вызывать весь запрос с помощью двоичного, а не текстового вывода (что, возможно, лучше в любом случае, но потребует переписывания этой части связующего слоя).

Вы можете увидеть, где вызывается pqexecparams, и заметить, что он вызывается с последним параметром 0, что в postgres docs означает, что все возвращается в текст. И для postgres это означает это забавное шестнадцатеричное представление, которое вы видите.

Если бы этот аргумент был заменен на 1, то можно было бы сделать более эффективно (включая получение необработанного двоичного кода для bytea поля) но Statement.hsc пришлось бы повсеместно переписать, чтобы десериализовать эти двоичные значения.

Это одна из тех вещей, которая немного раздражает многих людей, но никто еще не был достаточно мотивирован, чтобы переписать и отладить все это. Но, конечно, кто-то действительно должен!:-)

Я решил это, перейдя в postgresql.conf и добавив:

bytea_output = 'escape' #by default, it's 'hex'

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

Я знаю, что уже поздно, я также новичок в Stack Overflow, но я учил, что эта информация важна.

Другие вопросы по тегам