【问题标题】:Postgresql and Python: Insert UTF-8 stringPostgresql 和 Python:插入 UTF-8 字符串
【发布时间】:2018-01-26 13:46:28
【问题描述】:

我正在尝试将字符串列表插入 Postgres 表中。

字符串是文件夹名称,从 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')

条目为空。

我在这里做错了什么?我猜这是某种编码失败。

我在 Windows 8.1 上使用 python3.4 和 Postgresql 9.5。字段类型为“文本”。

【问题讨论】:

    标签: python windows postgresql unicode utf-8


    【解决方案1】:

    我相信你想要做的是在这里编码你的字符串。所以

        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

    【讨论】:

    • 谢谢。我想避免使用 encode() 和 decode()。手动插入字符串(在 phppgadmin 中)按预期工作。排序规则是en_US.UTF-8,字符类型也是en_US.UTF-8。
    • 可以手动查看数据库中的字符串吗?我想知道 phppgadmin 是否会自动为您编码字符串。
    • 这个线程似乎相关:sourceforge.net/p/phppgadmin/bugs/250
    • 您可能是对的:i.imgur.com/KbmO9Eq.png 在这种特殊情况下,phppgadmin 不会显示字符串。如果我输入一个没有日期的稍短的字符串,它会正确显示变音符号。我事先通过插入一个“äöü”进行了测试,它可以正常工作,因此期望 phppgadmin 可以正常工作。第一行应显示开头帖子中的字符串。它确实在 phppgadmin 之外的正常查询中正确显示。我会接受你的回答,因为你把我带到了正确的轨道上。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多