【问题标题】:Problems inserting utf8 data to PostgreSQL with Python使用 Python 将 utf8 数据插入 PostgreSQL 时出现问题
【发布时间】:2017-05-15 03:32:47
【问题描述】:

我正在阅读带有网络爬虫的斯堪的纳维亚语言网站 - 并希望将它们插入到我的 PostgreSQL 数据库中。

最初我尝试将我的 PSQL DB 编码为 utf-8,然后手动尝试插入会出现问题的字符,如下所示:

Insert into name (surname) VALUES ('Børre');

这是在 Windows PSQL shell 中完成的。

这给了我以下错误:错误:编码“UTF8”的字节序列无效:0x9b。因此,在进行了一些谷歌搜索后,我将客户端编码更改为 latin1。现在该声明成功了。服务端编码还是utf8。

当我通过我的 python 脚本执行相同的插入操作时,名称在我的数据库中显示为 B°rre。如果我将客户端的编码改回 utf8,我也会得到带有错误特殊字符的条目。

我的 python 脚本是 utf8 编码的,但打印的名称是正确的。

插入语句:

con = psycopg2.connect(*database details*)

print("Opened database successfully")

cur = con.cursor()

#INSERT NAME

query = "INSERT INTO name (surname) VALUES (%s) RETURNING id"

data = ('børre')

cur.execute(query,data)

如前所述,print(personObject.surname) 给出 'Børre'

如果我尝试以下操作:

query = "INSERT INTO name (surname) VALUES (%s) RETURNING id"

data = ('børre'.encode('utf-8'))

cur.execute(query,data)

我在我的数据库中得到以下信息:

\x62c383c2b8727265

【问题讨论】:

  • 哪个版本的 Python?
  • 你能发布你的堆栈跟踪吗?
  • 为什么不用UTF-8编码呢?今天,没有理由不使用它。
  • Python 版本为 3.x。我从 utf-8 更改的原因在问题的开头说明了。我会尽快用堆栈跟踪更新问题。
  • 堆栈跟踪没有输出任何东西,我在 python 中没有错误。 @LaurentLAPORTE

标签: python windows postgresql encoding utf-8


【解决方案1】:

psycopg2 不理解 postgresql 查询,它只是将给定的参数转换为它们的 postgresql 表示

如果你给它一个字节数组来将它转换成一个 postgresql BYTEA 文字,

data = ('børre'.encode('utf-8')) 为您提供bytes

所以,不要那样做,使用string

顶部的代码片段应该可以工作。

在错误中我看到ø 编码为十六进制c383c2b8,该十六进制转换为UTF8 为两个字符ø。在我看来,python 认为您的脚本不是 UTF8,而是其他一些代码页。

【讨论】:

  • 感谢您的回答!关于如何让 PSQL 数据库中的“børre”成为“børre”的任何建议?
【解决方案2】:

使用client_encoding关键词
例如:conn=psycopg2.connect("dbname='foo' user='dbuser' password='mypass' client_encoding='utf8'")

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多