3

私は元 Digital Equipment Co のエンジニアです (多数の非常に大きなシステムで Rdb/RTR/VMS を使用しており、C 年間で 10 年間の分散システム処理の経験がありますが、かなり昔のことです)。

問題を診断する際に、このエラーが実際に何を意味するかについてのアドバイスを探しています。これがPostgresのエラーメッセージです

ERROR: invalid byte sequence for encoding "UTF8": 0xe6 0x62 0x40

環境 MAC Maveriks XOS、GNU C、Xcode、Postgres 9.3。(サーバー側)libpqを使用

私はPostgresを初めて使用しますが、Cクエリセットを作成して、ユーザーテーブル、列、データ型、長さ、序数位置に関するすべてのメタデータをPostgresから取得し、それらを自分のカタログのメモリに保持し、すべての単純なユーザーテーブルを生成します動的にクエリします。

このクエリは、クエリ準備呼び出しを通過しました。

防御的に書いて、エラーを2回チェックしました。

 if ((res = PQprepare(db, statement_name, insert_query, data->nParam, NULL)) == NULL)
     Dbms_Crash(db, NULL, "Dbms_insert() PQprepare returned NULL");

 if (PQresultStatus(res) != PGRES_COMMAND_OK)
     Dbms_Crash(db, res, "Dbms_insert() Failed");

 PQclear(res);

これは、生成されたクエリのパーサー ダンプです。

insert_query:
INSERT INTO image_metadata (latitude,longitude,altitude,filename,utc_datetime)
VALUES ($1::double precision,$2::double precision,$3::double precision,$4::character varying,$5::timestamp without time zone);

失敗する呼び出しは次のとおりです。

    res = PQexecPrepared(db,
                         statement_name,
                         data->nParam,
                         (const char* const *)data->ptParam[i],
                         data->pdlParam[i],
                         data->pParamfmt,
                         PGFORMAT_STRING);

ERROR: invalid byte sequence for encoding "UTF8": 0xe6 0x62 0x40

utc_datetimePostgresYYYY-MM-DD HH:MM:SSが OSI 協定世界時日付を期待する日付形式の問題を乗り越えて、それをフィードしていたところYYYY:MM:DD、この 1 つのエラーが次のエラーになりました。(したがって、Postgresが5番目のパラメーターの問題の日付を出力したため、配列の間接化、インデックス作成などが機能しています)

明らかなパラメーター ダンパーを作成して、何を供給しているかを確認していますが、日付形式を修正したときにエラーが解消されたときに日付が正しいことはわかっています。

UTF8 メッセージは、ファイル名文字列または倍精度フィールドの 1 つから来ていますか?
バイナリを渡すのは悪い考えで、文字列を渡すだけで問題が減る可能性はありますか?

私のスキーマには最終的に 30 個のテーブルがあり、サーバー側でのメモリ アラインメントのこの種のエラーは非常に心配です。私の目標はゼロの SQL コードを書くことです。

4

1 に答える 1

2

PQprepare() 関数では、最後のパラメータが NULL です。これは、すべてのクエリ パラメータがテキスト形式であることを意味します。それらのいくつかをバイナリとして渡した場合、単にゴミを送っただけです。私のアドバイスは、準備されたクエリのパラメーターにテキスト形式を使用することです。

于 2014-05-11T00:52:28.783 に答える