错误:编码“UTF8”的无效字节序列

时间:2014-03-16 10:54:52

标签: linux database postgresql utf-8 postgresql-9.1

我查看了类似的问题,但仍未找到合适的解决方案。

在我的Ubuntu OS上,我创建了一些数据库:

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"

我想添加一些包含Cyrillic的数据,但是我收到了这个错误:

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 个答案:

答案 0 :(得分:3)

我怀疑您的客户端应用程序实际上是以koi8-riso-8859-5编码发送数据,而不是utf-8,但您的client_encoding告诉PostgreSQL期望UTF-8。< / p>

将输入数据转换为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,我有点疑惑。所以这还没有完全解释。事实上,我找不到生成该字节序列的 Пупкин Василий Иванович的任何编码,所以我想知道是否有一些双重编码或类似的重整进行。我需要更多地了解你的环境才能说出更多;看到对原始问题的评论。

答案 1 :(得分:0)

我解决了这个问题,但我真的不知道哪些行为最有用:
1)我使用readline和zlib库重建并重新安装了postgreSQL(之前我使用keys --without-zlib和--without-readline运行configure)。
2)我开始使用单引号而不是双引号 无论如何,谢谢大家。

答案 2 :(得分:0)

解决方法:将数据放入UTF-8编码的csv文件中,然后导入(/copy)。
您可以使用Notepad ++:Encoding&gt; Convert to UTF-8创建文件。