Есть ли способ вставить вектор <unsigned char> в таблицу postgresql, с атрибутом bytea, без ошибки кодирования UTF8? - PullRequest
2 голосов
/ 21 июня 2019

Я получаю ERROR: invalid byte sequence for encoding "UTF8": 0xe0 0x20 0x63, когда пытаюсь выполнить SQL-оператор (вставить в) std :: vector в bytea.

Я использую c++ (11), and pqxx postgresql client, and posgresql 9.6.Мне нужно записать в БД поток байтов (вектор).

Очень часто мой код работает хорошо, но теперь я столкнулся со следующей ошибкой:

ОШИБКА: недопустимая последовательность байтов для кодировки "UTF8": 0xe0 0x20 0x63

Из pgAdmin4 я получаю:

show 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 голосов
/ 21 июня 2019

pqxx::binarystring для байтовых данных, которые вы читаете с сервера.

Для отправки двоичных данных в doc написано:

Для преобразования другим способом, то есть из необработанной серии байтов в строку подходит для включения в качестве значений байтов в SQL, используйте Функции esc_raw () транзакции.

...