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 中提取有关用户表、列、数据类型、长度和序数位置的所有元数据,将它们保存在我自己的目录中的内存中并生成所有简单的用户表动态查询。

该查询通过了查询准备调用。

防御性写作我检查了两次错误:

 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_datetimePostgres 期望YYYY-MM-DD HH:MM:SSOSI 通用协调时间日期的日期格式问题,我正在输入它YYYY:MM:DD,这个错误变成了下一个错误。(所以我的数组间接、索引等正在工作,因为 Postgres 打印了第五个参数的违规日期)

我正在编写明显的参数转储器来查看我正在喂它的内容,但我知道当我修复日期格式时错误消失时它得到了正确的日期。

UTF8 消息是来自文件名字符串还是双精度字段之一?
传递二进制文件是不是一个坏主意,只传递字符串可能会导致更少的问题?

我的架构最终会说 30 个表,这种类型的服务器端内存对齐错误非常令人担忧。我的目标是编写零 SQL 代码。

4

1 回答 1

2

在您的 PQprepare() 函数中,最后一个参数为 NULL。这意味着所有查询参数都是文本格式。如果你将其中的一些作为二进制传递,你发送的只是一个垃圾。我的建议是在准备好的查询中使用文本格式的参数。

于 2014-05-11T00:52:28.783 回答