2014-05-10 135 views
3

我是一名前数字设备公司工程师(与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代码。

+0

你作为_filename_参数传递了什么字符串? – klin

+0

所以我成功地加载了15行UTF8错误是间歇性的。文件名是正确的,当我从PGAdmin看时,时间戳也是如此。双精度是所有三个高度,经度和纬度的垃圾。所以我会看看那里。[d] 列名[latitude]参数长度:8 列名[longitude]参数长度:8 列名[altitude]参数长度:8 列名[filename]参数长度:94 Columnname [utc_datetime]参数长度:19 – user3624412

+0

“data”的结构定义是什么data-> ptParam []'应该是一个指向字符串指针的指针数组,这看起来很尴尬。也许省略'[i]'索引? – wildplasser

回答

2

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

+0

谢谢,我会这样做。 – user3624412

+0

修复完成,再次感谢。我在系统表中注意到Postgres中的SQLCA和SQLDA结构,但它们没有被libpq接口公开。如果存在对此的访问层,则可以强制内存对齐,并将C结构模板放在连续的内存块上,并解决数据定义和映射中的许多问题。同时将gizzions的内存分配从一个或两个调用中切断。我以前使用过这种技术,可以生成数百个表格的数据访问层的70%,并且没有阻抗不匹配。我想我可以看看Postgres的源代码。 – user3624412

+1

请做。如果您在特定领域找到改进空间并且可以提供详细建议*请*让pgsql-hacker知道。修补程序甚至更好,但在提出讨论之前不要花费大量时间在修补程序上;有时候事情并没有因为某种原因而以特定的方式完成。另外,我建议你检查一下'libpqtypes'(我想把它放在'libpq'中),它可以让事情变得更简单。 –