0

Postgresqlデータベースのlibpqライブラリを使用していますが、dbからbyteaデータを取得する際に問題が発生します。問題を解決できなかったので、お聞きしたいと思います。画像ファイルをdbに挿入して取り戻そうとすると、返されるデータのサイズは常に送信したデータの2倍になります。実際には、正確な方程式は次のとおりです。取得データ=送信データ* 2 + 2.(バイト単位)。だから、私はまだそれを理解することができませんでした、私はおそらく何かが欠けています:/

私が使用するサンプルコードは次のようなものです:

PGresult*    res;
const char*  paramValues[1] = {plateImageArray.data()}; // data type is const char*
int          paramLengths[1] = {plateImageArray.size()}; // size of image is 58573 bytes
int          paramFormats[1] = {1}; // 1 for byte, 0 for text

res = PQexecParams(conn,
        "INSERT INTO \"plates\" (plateImage) VALUES ($1::bytea)",
        1,               /* param number */
        NULL,            /* param type */
        paramValues,     /* param values*/
        paramLengths,    /* param lengths */
        paramFormats,    /* default to all text params */
        1);              /* return type, 1 for text. */

res = PQexec(conn,"Select * from \"plate_images\" WHERE ...."); /*returns 1 tuple : something / something / image(bytea) */

int lengthOfPlateImage=PQgetlength(res,0,2); // indicates 117148 bytes, exactly 2 times of sent data +2 

皆さんが私を助けてくれたらありがとう。私はその理由を探すのにひどく退屈しています。

前もって感謝します。

編集:ディスクに保存されているデータを追跡しましたが、挿入されたデータのサイズは同じです(58573バイト)。取得中に2倍のデータになります...

4

1 に答える 1

2

さて、「PQexec」コマンドで行われたクエリはテキスト形式で値を返し、結果をテキスト形式にするかバイトにするかを示すパラメータはありません。クエリを実行するためのより適切で適切なコマンドが存在するかどうかはわかりませんが、「PQexecParams」を使用して戻りタイプ1(バイトの場合は1、テキストの場合は0)を設定すると、期待されるサイズの正確なデータが返されました。とにかくありがとう。

于 2013-03-16T13:36:12.987 に答える