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

Я смотрел на похожие вопросы, но до сих пор не нашел подходящего решения.

На моей ОС Ubuntu я создал базу данных:

createdb PADB -W

И создал таблицу.

create table teacher(
    id_teacher integer PRIMARY KEY,
    name varchar(120),
    experience integer 
);

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "teacher_pkey" for table "teacher"

Я хочу добавить некоторые данные, содержащие кириллицу, но я получил эту ошибку:

PADB=# insert into teacher (name, experience) values ("Пупкин Василий Иванович", 15);
ERROR:  invalid byte sequence for encoding "UTF8": 0xd0d0

Вот мои настройки lc:

PADB=# select name, setting from pg_settings where name like 'lc_%';
    name     |   setting   
-------------+-------------
 lc_collate  | ru_RU.UTF-8
 lc_ctype    | ru_RU.UTF-8
 lc_messages | ru_RU.UTF-8
 lc_monetary | ru_RU.UTF-8
 lc_numeric  | ru_RU.UTF-8
 lc_time     | ru_RU.UTF-8
(6 rows)

Что случилось?

Postgresql 9.1.11

3 ответа

Решение

Я решил проблему, но я действительно не знаю, какие из моих действий были наиболее полезными:
1) Я перестраиваю и переустанавливаю postgreSQL с библиотеками readline и zlib (ранее я запускал configure с ключами --without-zlib и --without-readline).
2) Я начал использовать одинарные кавычки вместо двойных.
Спасибо всем в любом случае.

Я подозреваю, что ваше клиентское приложение на самом деле отправляет данные в koi8-r или же iso-8859-5 кодировка, а не utf-8, но твой client_encoding говорит PostgreSQL ожидать UTF-8.

Либо конвертируйте входные данные в utf-8, либо измените client_encoding чтобы соответствовать входным данным.

Декодирование ваших данных с различными кодировками приводит к:

>>> print "\xd0\xd0".decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd0 in position 0: invalid continuation byte

>>> print "\xd0\xd0".decode("koi8-r")
пп

>>> print "\xd0\xd0".decode("iso-8859-5")
аа

Однако, как ни странно, ваш вклад не содержит ничего из этого. Я немного озадачен тем, какая кодировка превратится Пупкин Василий Иванович в последовательность байтов\xd0\xd0, Так что это еще не полностью объяснено. На самом деле, я не могу найти какую-либо кодировку Пупкин Василий Иванович который производит эту последовательность байтов, поэтому мне интересно, происходит ли какое-либо двойное кодирование или подобное искажение. Мне нужно больше знать о вашем окружении, чтобы сказать больше; см. комментарии к исходному вопросу.

Обходной путь: поместите данные в CSV-файл в кодировке UTF-8, затем импортируйте (/copy).
Вы можете использовать Notepad ++: Encoding > Convert to UTF-8 создать файл.

Другие вопросы по тегам