私は元 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_datetime
PostgresYYYY-MM-DD HH:MM:SS
が OSI 協定世界時日付を期待する日付形式の問題を乗り越えて、それをフィードしていたところYYYY:MM:DD
、この 1 つのエラーが次のエラーになりました。(したがって、Postgresが5番目のパラメーターの問題の日付を出力したため、配列の間接化、インデックス作成などが機能しています)
明らかなパラメーター ダンパーを作成して、何を供給しているかを確認していますが、日付形式を修正したときにエラーが解消されたときに日付が正しいことはわかっています。
UTF8 メッセージは、ファイル名文字列または倍精度フィールドの 1 つから来ていますか?
バイナリを渡すのは悪い考えで、文字列を渡すだけで問題が減る可能性はありますか?
私のスキーマには最終的に 30 個のテーブルがあり、サーバー側でのメモリ アラインメントのこの種のエラーは非常に心配です。私の目標はゼロの SQL コードを書くことです。