【问题标题】:Postgres COPY into hstore field with double quote in valuePostgres COPY 到 hstore 字段中,值中有双引号
【发布时间】:2020-06-27 15:26:08
【问题描述】:

我已经尝试使用 COPY 命令从 CSV 文件填充 Postgres 12 数据库几个小时。有问题的表有一个 hstore 字段,其中一个键值对在值中有一个双引号 "

Postgres 数据库是这样创建的

CREATE TABLE test ( 
    title VARCHAR(20),
    tags hstore
);

CSV 文件使用tabs 作为分隔符,看起来像这样

My Title | name=>"""Paul "Butch" Newman""", job=>actor

名称值需要双引号和转义,因为它包含空格。

|代表一个制表符。

我的导入语句如下所示:

COPY test (title, tags) 
FROM '/var/lib/postgresql/data/test.csv'
DELIMITER E'\t' CSV ENCODING 'UTF8';

数据库按预期填充,但是当我用

查询它时

SELECT tags->'name' as name FROM test;

pgAdmin 4 返回

Paul Butch Newman

而不是

Paul "Butch" Newman

我的问题是如何将双引号放入实际的 hstore 值中?

我找到了很多关于导入文本字段的双引号的答案。但是这里导入的是一个hstore 字段,并且该值需要在此处使用双引号,因为它包含空格。

谢谢!

【问题讨论】:

    标签: sql postgresql escaping postgis hstore


    【解决方案1】:

    我只是在本地玩过这个。

    我假设您可以控制输入文件的格式。

    问题在于 CSV 格式将在双引号括起来的元素中找到的 "" 转换为 " 在传递它们时。

    这对我来说得到了你想要的结果:

    My Title | name=>"""Paul \""Butch\"" Newman""", job=>actor
    

    一旦 CSV 处理程序通过将双引号转换为单引号完成转义,它会将 name=>"Paul \"Butch\" Newman", job=>actor 传递给 insert,这就是您在 psql 或 PgAdmin 中将其编写为文字的方式。

    select tags->'name' as name
      from test_hstor;
    
            name         
    ---------------------
     Paul "Butch" Newman
    (1 row)
    

    出于好奇,我检查了将其作为文本而不是 csv 导入,并且输入记录必须包含 name=>"Paul \\"Butch\\" Newman", job=>actor 才能正常工作。

    【讨论】:

    • 太好了,效果很好。谢谢!刚刚出现的另一个想法是用 unicode 文字替换引号,但我还没有尝试过。
    猜你喜欢
    • 2012-10-22
    • 2019-12-17
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2022-11-15
    • 2016-09-14
    相关资源
    最近更新 更多