2016-12-30 34 views
0

私はスカンジナビア語のWebサイトをWebクローラーで読んでいて、それらをPostgreSQLデータベースに挿入したいと考えています。PythonでPostgreSQLにutf8データを挿入する際の問題

は、もともと私は、手動でこのような問題であろう文字を挿入しようとした、UTF-8として私PSQL DBをエンコードしてみました:

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

これは、Windows PSQLシェルで行われました。

これは私に以下のエラーを与えました:エラー: "UTF8"をエンコードするための無効なバイトシーケンス:0x9b。だから私はいくつかのグーグルを行った後、私はlatin1にクライアントのエンコーディングを変更しました。今、その声明は成功しました。サーバーのエンコーディングはまだutf8です。

私は私のpythonスクリプトを介して同じ挿入を行うと、その名前が私のデータベースにBレレとして現れます。クライアントのエンコーディングを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) 

、プリント(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はそれだけで

data = ('børre'.encode('utf-8'))はあなたを取得、あなたはそれを文字通りのpostgresql BYTEAに変換しますバイトの配列を与える場合は、そのPostgreSQLの表現

に与えられた引数を変換し、PostgreSQLのクエリを理解していませんbytes

だから、stringを使用してください。

先頭にあるコード部分が機能するはずです。私は六角c383c2b8としてエンコードø参照エラーで

は、そのヘクスは、2つの文字 øとしてUTF8に変換されます。あなたのスクリプトはUTF8ではなく、いくつかの他のコードページであるとPythonが考えるように見えます。

+0

ありがとうございました!どのように私はPSQLデータベースでも 'børre'になる 'børre'を得る方法についての任意の提案ですか? – bjornasm

+0

それはちょうど動作するはずです... – Jasen

関連する問題