Postgres数组语法包含使用CSV的反斜杠或双引号

时间:2018-01-03 17:12:16

标签: postgresql csv

使用CSV插入包含反斜杠和/或双引号的数组的Postgres COPY语句的语法是什么?

使用:

  • 复制声明:COPY test (a, b) FROM 'file.csv' (FORMAT CSV, DELIMITER ',');
  • 表:CREATE TABLE test(a text, b text[])

我尝试了以下语法:

  • "a""a\a.com","{""aaa\zzzeee""}":数组中的黑色斜线被丢弃;
  • "a""a\a.com","{""aaa\\zzzeee""}":数组将包含两个\

1 个答案:

答案 0 :(得分:2)

似乎第二个选项(加倍反斜杠字符)确实有效:

# cat /tmp/file.csv
"a""a\a.com","{""aaa\\zzzeee""}"
# echo "CREATE TABLE test(a text, b text[]);" | psql
CREATE TABLE
# echo "COPY test (a, b) FROM '/tmp/file.csv' (FORMAT CSV, DELIMITER ',');" | psql
COPY 1
# echo "SELECT b[1] FROM test LIMIT 1;" | psql
     b
------------
 aaa\zzzeee
(1 row)
# 

您可能引用的双反斜杠(\\)可能是psql在显示完整数组时执行转义:

# echo "SELECT b FROM test LIMIT 1;" | psql
        b
-----------------
 {"aaa\\zzzeee"}
(1 row)

documentation (8.15.6. Array Input and Output Syntax)

中描述了此行为
  

如果元素值为空字符串,包含花括号,分隔符,双引号,反斜杠或空格,或者匹配单词NULL,则数组输出例程将在元素值周围放置双引号。双引号和嵌入在元素值中的反斜杠将被反斜杠转义