【问题标题】:ERROR: invalid byte sequence for encoding "UTF8"错误:编码“UTF8”的字节序列无效
【发布时间】:2014-03-16 10:54:52
【问题描述】:

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

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

【问题讨论】:

  • 你的 mysql 客户端可能没有以 utf8 格式发送数据
  • 您使用什么客户端应用程序连接到 PostgreSQL?
  • 顺便说一句:id_teacher integer PRIMARY KEY,:id_teacher 不能为 NULL,因此您的插入将失败,因为它没有为 id_teacher 提供值。 (你是说SERIAL 吗?)
  • 另外,请在您运行psql 的终端中显示locale 命令的输出。完成后在此处编辑问题和评论。
  • 如果你的意思是连载,你应该连载。只是为了不让我们猜测。

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


【解决方案1】:

我怀疑您的客户端应用程序实际上是以koi8-riso-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。所以这还没有完全解释清楚。事实上,我找不到产生该字节序列的Пупкин Василий Иванович任何 编码,所以我想知道是否有一些双重编码或类似的处理。我需要更多地了解您的环境才能说更多;请参阅原始问题的 cmets。

【讨论】:

  • 我使用 psql 连接到服务器。我的语言环境:maxim@maxim-VirtualBox:~$ locale LANG=ru_RU.UTF-8 LANGUAGE=en LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=
【解决方案2】:

我解决了问题,但我真的不知道我的哪个操作最有用:
1) 我使用 readline 和 zlib 库重建并重新安装了 postgreSQL(之前我使用键 --without-zlib 和 --without-readline 运行配置)。
2) 我开始使用单引号而不是双引号。
总之谢谢大家。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 嗯.. 好的 - 我只阅读了您问题的 标题。答案是对谷歌用户有用。我已经更正了它现在对您的问题有效,部分有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2022-01-26
    • 2011-06-19
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多