Как справиться с ошибкой кодировки UTF-8 в libpq?

Я создал эту функцию для вставки данных в базу данных:

void add_data_to_db(){
        const char *data[2][2] = {"2","e"};
        re = PQexecParams(connection,
                        "INSERT INTO test_table "\
                        "VALUES ($1, $2);",
                        2,NULL,data[2],NULL,NULL,0);
        if(PQresultStatus(re) != PGRES_TUPLES_OK){
                printf("%s\n", PQresultErrorMessage(re));
        }

        PQclear(re);
}

но когда я запускаю программу, она печатает:

ERROR:  invalid byte sequence for encoding "UTF8": 0x80

насколько я знаю, эта проблема возникает, когда у нас есть добавление нулевого значения в таблицу, но у меня этого нет.


person Amir reza Riahi    schedule 01.07.2020    source источник
comment
data[2] (в вызове функции) мне кажется необычным; это за концом этого массива   -  person Daniel Jour    schedule 01.07.2020
comment
@DanielJour, как я могу упомянуть слова или символы в массиве таким образом?   -  person Amir reza Riahi    schedule 01.07.2020


Ответы (2)


Он должен быть const char *data[2], а вызов функции должен иметь data, а не data[2].

Сообщение об ошибке означает, что PostgreSQL обнаружил байты, которые не являются частью правильно закодированной строки UTF-8.

person Laurenz Albe    schedule 02.07.2020
comment
Я хочу иметь массив некоторых строк, а затем добавить их в базу данных. если я не могу создать data[n][n] как я могу это сделать? - person Amir reza Riahi; 02.07.2020
comment
Либо char data[2][2], либо char *data[2], но не char *data[2][2]. - person Laurenz Albe; 02.07.2020
comment
Я изменил строку определения data на const char data[2][2] и вместо использования data[2] в пятом параметре я использовал data, но во время компиляции все еще возникают ошибки. - person Amir reza Riahi; 04.07.2020
comment
Так как ошибки мне неизвестны, советовать не могу. - person Laurenz Albe; 06.07.2020
comment
теперь у меня есть массив char splitted_line[8][50]; и я использовал его есть ошибка note: expected ‘const char * const*’ but argument is of type ‘char (*)[50]’ и предупреждение warning: passing argument 5 of ‘PQexecParams’ from incompatible pointer type [-Wincompatible-pointer-types] 99 | 8,NULL, splitted_line,NULL,NULL,0); спасибо за помощь. - person Amir reza Riahi; 06.07.2020
comment
Добавьте приведение типа. - person Laurenz Albe; 06.07.2020
comment
не могли бы вы объяснить больше? - person Amir reza Riahi; 06.07.2020

Согласно документации, пятый аргумент PQExecParams должен быть const char * const *paramValues .. , поэтому указатель на указатели констант, которые указывают на константу char. В документации указано, что он должен указывать на массив указанной (в третьем аргументе) длины (здесь 2).

data[2] — это третий элемент массива data (упс, в нем всего два элемента!).

data превратится в указатель на первый элемент; это указатель на массив из двух указателей, каждый из которых указывает на строку. Именно то, что вам нужно.

person Daniel Jour    schedule 01.07.2020