我是一名前数字设备公司工程师(与Rdb/RTR/VMS一起在很多非常大的系统上工作,并且在C年拥有10年的分布式系统处理经验......但很久以前)。libpq调用提供“UTF8”:0xe6 0x62 0x40
我在寻找关于这个错误在实践中意味着什么的建议,因为我会去诊断问题。这里是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消息是来自文件名字符串还是其中一个双精度字段?
传递二进制是一个坏主意,只是传递字符串可能会导致更少的问题?
我的模式最终会说30个表,这种类型的服务器端内存对齐错误是非常令人担忧的。我的目标是编写零SQL代码。
你作为_filename_参数传递了什么字符串? – klin
所以我成功地加载了15行UTF8错误是间歇性的。文件名是正确的,当我从PGAdmin看时,时间戳也是如此。双精度是所有三个高度,经度和纬度的垃圾。所以我会看看那里。[d] 列名[latitude]参数长度:8 列名[longitude]参数长度:8 列名[altitude]参数长度:8 列名[filename]参数长度:94 Columnname [utc_datetime]参数长度:19 – user3624412
“data”的结构定义是什么data-> ptParam []'应该是一个指向字符串指针的指针数组,这看起来很尴尬。也许省略'[i]'索引? – wildplasser