【问题标题】:issue with encoding when importing json into Postgres将 json 导入 Postgres 时出现编码问题
【发布时间】:2018-11-02 04:32:45
【问题描述】:

我正在使用 pandas,并将数据导出为 json,如下所示:

import pandas as pd
df = pd.DataFrame({'a': ['Têst']})

df.to_json(orient='records', lines=True)
> u'{"a":"T\\u00east"}'

这是有道理的,因为我们有一个以 \u 为前缀的 Unicode 字符 00ea,并且在转换为 JSON 时会使用 \ 进行转义

然后我使用 COPY 将 JSON 字符串导入 Postgres

buffer = cStringIO.StringIO()
buffer.write(df.to_json(orient='records', lines=True))
buffer.seek(0)

with connection.cursor() as cursor:
  cursor.copy_expert(sql="""
  COPY tmp (json_data) FROM STDIN WITH NULL AS '' ENCODING 'UTF8';
  """, file=buffer)

问题是数据库中的结果最终是

{"a": "Tu00east"}

如您所见,双重 \\ 消失了。

我尝试使用CSV 作为 COPY 模式,但由于某些数据中有逗号,因此它搞砸了,并且尝试将 ESCAPE 字符和 DELIMITER 设置为其他内容似乎总是会导致失败。

表格列具有jsonb 类型。我在文档中读到 PG 不喜欢 \x003f 上的非 ASCII Unicode,除非 DB 编码是 UTF8,在我的情况下,这应该不是问题。

我试图弄清楚为什么这里要删除转义字符,以及如何导入 Postgres 并保存编码。

【问题讨论】:

    标签: python postgresql pandas unicode


    【解决方案1】:

    COPY 的csv 选项与DELIMITER e'\x01' QUOTE e'\x02' 一起使用。我不确定这是否适用于所有可能的有效 JSON,但我从来没有失败过。

    $ psql -X testdb -c 'create table t(d jsonb)'
    CREATE TABLE
    $ cat foo.json
    {"a":"Têst"}
    $ cat foo.json | psql -X testdb -c "COPY t from stdin csv delimiter e'\x01' quote e'\x02'" 
    COPY 1
    $ psql -X testdb -c 'select * from t';                                                    
           d       
    ---------------
     {"a": "Têst"}
    (1 row)
    

    【讨论】:

    • 好的,很有趣。你能解释为什么 \x01 和 \x02 吗?我猜只是在数据中找不到的东西,对吧?
    • 似乎 CSV 的诀窍是避免任何常见字符。我试图将引号、转义等设置为我所拥有的,但我在这里看到了诀窍,因为 PG 需要按原样获取字符串,因为它们已经被转义并正确编码。
    • 导入时的编码支持怎么样?
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2020-02-04
    相关资源
    最近更新 更多