2016-12-30 76 views
0

我正在用网络爬虫读取斯堪的纳维亚语言网站 - 并希望将它们插入到我的PostgreSQL数据库中。使用Python将utf8数据插入PostgreSQL的问题

本来我试图编码我PSQL DB为UTF-8,然后手动尝试插入会是这样一个问题的字符:

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

这是在windows PSQL椰壳。

这给了我以下错误:错误:编码为“UTF8”的无效字节序列:0x9b。因此,在做了一些Google搜索之后,我将客户端编码更改为latin1。现在这个声明是成功的。服务器编码仍然是utf8。

当我通过我的python脚本执行相同的插入操作时,该名称将以数据库的形式出现在我的数据库中。如果我将客户端的编码更改为utf8,我还会得到具有错误特殊字符的条目。

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

Insert语句:

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) 

如前所述,打印(personObject.surname)给出 '博雷'

如果我尝试以下方法:

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

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

cur.execute(query,data) 

我得到以下我的数据库:

\ x62c383c2b8727265

+1

哪个版本的Python? –

+1

你可以发布你的堆栈跟踪吗? –

+1

为什么不使用UTF-8编码?今天,没有理由不使用它。 – Daniel

回答

1

psycopg2不理解PostgreSQL的查询,如果你给它字节将其转换为一个PostgreSQL BYTEA文字的阵列,它只是给出转换到他们的PostgreSQL表示

的论点,

data = ('børre'.encode('utf-8'))让你一个bytes

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

你在顶部的代码片段应该工作。

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

+0

谢谢你的回答!关于如何让'børre'在PSQL数据库中成为'børre'的任何建议? – bjornasm

+0

它应该只是工作.. – Jasen

相关问题