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