2016-12-30 45 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

相關問題