Я бывший инженер Digital Equipment Co (работал с Rdb/RTR/VMS на множестве очень больших систем и имею 10-летний опыт обработки распределенных систем в C-летах... но довольно давно).
Я ищу совета о том, что эта ошибка означает на практике, поскольку я занимаюсь диагностикой проблемы. Вот сообщение об ошибке 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.
data->ptParam[]
должно быть массивом указателей на указатели на строку, что выглядит неуклюже. Может быть, опустить индексацию[i]
? - person wildplasser   schedule 11.05.2014