我查看了类似的问题,但仍未找到合适的解决方案。
在我的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
答案 0 :(得分:3)
我怀疑您的客户端应用程序实际上是以koi8-r
或iso-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
创建文件。