用Python

时间:2016-12-30 21:26:10

标签: python windows postgresql encoding utf-8

我正在阅读带有网络爬虫的斯堪的纳维亚语网站 - 并希望将它们插入到我的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

2 个答案:

答案 0 :(得分:1)

psycopg2不了解postgresql查询它只是将给出的参数转换为postgresql表示

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

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

所以,不要这样做,请使用string

顶部的代码片段应该有效。

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

答案 1 :(得分:0)

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