Linux 错误:编码的字节序列无效;UTF8";

Linux 错误:编码的字节序列无效;UTF8";,linux,database,postgresql,utf-8,postgresql-9.1,Linux,Database,Postgresql,Utf 8,Postgresql 9.1,我研究了类似的问题,但仍然没有找到合适的解决方案 在我的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 i

我研究了类似的问题,但仍然没有找到合适的解决方案

在我的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

我怀疑您的客户端应用程序实际上是在以
koi8-r
iso-8859-5
编码发送数据,而不是
utf-8
,但您的
客户端编码
告诉Postgresql需要utf-8

将输入数据转换为utf-8,或更改
客户端编码
以匹配输入数据

使用不同编码解码数据会产生:

>>> 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”。解码(“utf-8”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib64/python2.7/encodings/utf_8.py”,第16行,解码
返回编解码器.utf_8_解码(输入,错误,真)
UnicodeDecodeError:“utf8”编解码器无法解码位置0中的字节0xd0:无效的连续字节
>>>打印“\xd0\xd0”。解码(“koi8-r”)
пп
>>>打印“\xd0\xd0”。解码(“iso-8859-5”)
аа

然而,相当奇怪的是,您的输入似乎不包含这些内容。我有点困惑,什么样的编码会把
变成字节序列
\xd0\xd0
。所以这还没有完全解释清楚。事实上,我找不到任何产生该字节序列的
编码,所以我想知道是否存在双重编码或类似的混乱。我需要更多地了解你们的环境,才能说得更多;请参阅对原始问题的评论。

我解决了问题,但我真的不知道我的哪些操作最有用:
1) 我使用readline和zlib库重建并重新安装了postgreSQL(以前我使用键运行configure——不使用zlib和——不使用readline)。
2) 我开始使用单引号而不是双引号。

无论如何,谢谢大家。

解决方法:将数据放在UTF-8编码的csv文件中,然后导入(
/copy
)。

您可以使用记事本++:
编码
转换为UTF-8
来创建文件。

您的mysql客户端可能不在UTF8中发送数据您使用什么客户端应用程序连接到PostgreSQL?顺便说一句:
id\u teacher integer主键,
:id\u teacher不能为空,因此,插入将失败,因为它没有为id\u teacher提供值。(您是指
SERIAL
?)另外,请在运行
psql
的终端中显示
locale
命令的输出。完成后,在这里编辑问题和评论。如果你指的是序列号,你应该说序列号。为了不让我们猜测,我使用psql连接到服务器。我的区域设置:
maxim@maxim-VirtualBox:~$locale LANG=ru\u ru.UTF-8 LANGUAGE=en LC\u CTYPE=“ru\u ru.UTF-8”LC\u NUMERIC=“ru\u ru.UTF-8”LC\u-ru.UTF-8”LC\u-COLLATE=“ru\u-ru.UTF-8”LC\u-MESSAGES=“ru\u-ru.UTF-8”LC\u-PAPER=“ru\u-ru.UTF-8”LC\u-NAME=“ru\u-ru.UTF-8”电话测量=“ru_ru.UTF-8”LC_IDENTIFICATION=“ru_ru.UTF-8”LC_ALL=
Hmm..好的-我只看了你问题的标题。答案对谷歌用户有用。我已经更正了它,现在对你的问题部分有效。