我是一名前数字设备 union 工程师(在许多非常大的系统上使用 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_datetime
中遇到了日期格式问题,其中 Postgres 期望 YYYY-MM-DD HH:MM:SS
用于 OSI 通用协调时间日期,我是喂它 YYYY:MM:DD
,这个错误变成了下一个错误。 (所以我的数组间接寻址、索引等工作正常,因为 Postgres 打印了第五个参数的违规日期)
我正在编写明显的参数转储器来查看我正在提供给它的内容,但我知道当我修复日期格式后错误消失时它得到了正确的日期。
UTF8 消息是来自文件名字符串还是 double 字段之一?
传递二进制是不是一个坏主意,只传递字符串可能导致的问题更少?
我的架构最终将有 30 个表,服务器端的这种内存对齐错误非常令人担忧。我的目标是编写零 SQL 代码。
最佳答案
在你的 PQprepare() 函数中,最后一个参数是 NULL。 这意味着所有查询参数都是文本格式。 如果您将其中一些作为二进制文件传递,则您发送的只是垃圾。 我的建议是在准备好的查询中对参数使用文本格式。
关于sql - libpq 调用给出 "UTF8": 0xe6 0x62 0x40,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587447/