2017-08-18 4 views
0

Postgresテーブルに文字列のリストを挿入しようとしています。PostgresqlとPython:UTF-8文字列を挿入する

文字列はフォルダ名で、Windowsマシンから収集され、UNIXスタイルの文字列に書き換えられます。

これは機能しますが、フォルダ名に "üöä"がある場合、挿入は失敗しませんが、空の文字列が挿入されます。ここではいくつかの例がある

def db_insert_paths(paths): 
    paths.sort() 
    for path in paths: 
     print(path) 
     print(type(path)) 

     cur.execute("INSERT INTO rasp (folder) VALUES (%s)", (path,)) 

    cur.close() 
    conn.close() 

    return 0 

: 私もPostgresのサーバに送信されるトラフィックをキャプチャここ

は、私は値を挿入するために使用するコードです。

/mnt/hdd/Bilder/2004/2004.08.15. Dorffest 
<class 'str'> 

INSERT INTO rasp (folder) VALUES ('/mnt/hdd/Bilder/2004/2004.08.15. Dorffest') 

この挿入が機能します。データはテーブルにあります。

ただし、次のものがない:

/mnt/hdd/Bilder/2004/2004.08.30. Filterschacht räumen und reinigen 
<class 'str'> 

INSERT INTO rasp (folder) VALUES ('/mnt/hdd/Bilder/2004/2004.08.30. Filterschacht r��umen und reinigen') 

Wireshark capture

エントリが空です。

私はここで間違っていますか?私はそれがいくつかの種類のエンコーディングが失敗していると推測しています。

私はWindows 8.1でPostgreSQL 9.5とともにpython3.4を使用しています。フィールドタイプは "text"です。

答えて

0

ここであなたの文字列をエンコードすると思います。 https://www.postgresql.org/docs/current/static/multibyte.html#AEN32089

+0

ありがとう:だから、

cur.execute("INSERT INTO rasp (folder) VALUES (%s)", (path.encode('utf-8',)) 

をそして、あなたはデシベルからそれを読みたい時にあなただけの代わりにpath.decode('utf-8')

でそれをデコードするよ、あなたはあなたのDBの文字セットを変更することができます。私はencode()とdecode()の使用を避けたいと思います。手動でphppgadminの文字列を挿入すると、期待どおりに動作します。 照合は 'en_US.UTF-8'で、文字型も' en_US.UTF-8'です。 – fsp

+0

データベース内の文字列を手動で表示できますか? phppgadminがあなたのために自動的に文字列をエンコードするのだろうかと思います。 –

+0

このスレッドは関連しているようです:https://sourceforge.net/p/phppgadmin/bugs/250/ –

関連する問題