2017-08-18 96 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上使用python3.4和Postgresql 9.5。字段類型是「文本」。

回答

0

我相信你想要做的是在這裏編碼你的字符串。所以

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

而當你想從數據庫中讀取它,你會只是path.decode('utf-8')

或者解碼它,你可以改變你的數據庫字符集:https://www.postgresql.org/docs/current/static/multibyte.html#AEN32089

+0

感謝。我想避免使用encode()和decode()。手動插入字符串(在phppgadmin中)像預期的那樣工作。 排序規則是'en_US.UTF-8',字符類型也是'en_US.UTF-8'。 – fsp

+0

您可以手動查看數據庫中的字符串嗎?我想知道phppgadmin是否會自動爲您編碼字符串。 –

+0

此主題似乎相關:https://sourceforge.net/p/phppgadmin/bugs/250/ –