ОШИБКА: неверная последовательность байтов для кодировки "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
создать файл.