有没有一种方法可以将vector <unsigned char>插入具有bytea属性且没有UTF8编码错误的postgresql表中?

时间:2019-06-21 15:49:25

标签: c++ postgresql stringstream libpqxx

当我尝试将std :: vector的sql语句(插入)执行到bytea中时,得到ERROR: invalid byte sequence for encoding "UTF8": 0xe0 0x20 0x63

我正在使用c++ (11), and pqxx postgresql client, and posgresql 9.6。我需要将一个字节流(向量)写入db。

通常我的代码运行良好,但是现在我遇到以下错误:

  

错误:编码“ UTF8”的字节序列无效:0xe0 0x20 0x63

从pgAdmin4我得到:

  

显示client_encoding; -> Unicode

从c ++,我使用以下代码从std :: stringstream填充此向量:

//mOutputStream is std::stringstream correctly filled
mOutputStream.seekg(0, std::ios::end);
int sizeOS = mOutputStream.tellg();
mOutputStream.seekg(0, std::ios::beg);
mOutputStream.unsetf(std::ios::skipws);

std::streampos vecSize;
mOutputStream.seekg(0, std::ios::end);
vecSize = mOutputStream.tellg();
mOutputStream.seekg(0, std::ios::beg);

//std::vector<unsigned char>& arrayChar
arrayChar.reserve(vecSize);

arrayChar.insert(arrayChar.begin(),                  

std::istream_iterator<unsigned char>(mOutputStream),
std::istream_iterator<unsigned char>());

然后,使用pqxx库创建一个sql语句:

sql = "Insert into public.\"MyFile\" (id,rawdata) values ($1,$2);";
/* Create a transactional object. */
pqxx::work W(C);
C.prepare("InsertRaw", sql);
...
void * bin_data = static_cast<void*>(arrayChar.data());  
size_t bin_size = arrayChar.size(); // ...and the size of the binary data

pqxx::binarystring blob(bin_data, bin_size);
//at this line i get the error of UTF8 encoding
pqxx::result r = W.prepared("InsertRaw")(idFile.c_str())(blob).exec();

W.commit();
C.disconnect();

这是我得到的错误:

  

错误:编码“ UTF8”的字节序列无效:0xe0 0x20 0x63

1 个答案:

答案 0 :(得分:0)

pqxx::binarystring用于处理您从服务器读取的字节数据。

对于提交二进制数据,doc表示:

  

以另一种方式转换,即从原始字节序列转换为字符串   适合作为BYtea值包含在SQL中,请使用   交易的esc_raw()函数。