0

byteaHDBC-postgreSQL ドライバー (バージョン 2.3.2.3) を使用して Postgres データベースのバイナリ データで満たされたフィールドを選択すると、次のようになります。

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

つまり、バイナリ データの 16 進表現が後に続くByteString文字列を含む を返します。\xこれは不便で、ひどく非効率的で、基本的に私には意味がありません。

SqlByteString実際のバイナリ データを含むバイト文字列を含む を返さない理由はありますか? 不足しているものはありますか、またはそれを行うようにドライバーを構成するにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

これをpostgresql.confに移動して追加することで解決しました:

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

出力がエンコードされなくなったため、挿入したとおりにデータを取得できるようになりました。

遅くなりましたが、私もStack Overflowは初めてですが、この情報が重要であることを教えてくれました。

于 2016-09-14T15:05:18.647 に答える
1

これは、このライブラリに関する長年の既知の問題です。たとえば、このバグを参照してください。

より広範な問題は、生のバイトを取得するには、postgres api では明らかにされていないかなりの賢さが必要になることです。テキスト出力ではなくバイナリでクエリ全体を呼び出す必要があります (これは間違いなく優れていますが、バインディング レイヤーのその部分を書き直す必要があります)。

pqexecparams が呼び出された場所を確認できます。最後のパラメーターが 0 で呼び出されていることに注意してください。これは、postgres のドキュメントによると、すべてがテキストで返されることを意味します。Postgres の場合、これはおかしな 16 進表現を意味します。

byteaその引数が 1 に交換された場合、(フィールドの生のバイナリを取得することを含めて) より効率的に実行できますが、Statement.hscこれらのバイナリ値を逆シリアル化するために広範囲に書き直す必要があります。

これは、多くの人にとって少しイライラするものの 1 つですが、全体を書き直してデバッグする十分な動機をまだ持っている人はいません。しかし、もちろん、誰かが本当にすべきです!:-)

于 2016-03-18T06:58:20.910 に答える