使用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""}"
:数组将包含两个\
。答案 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,则数组输出例程将在元素值周围放置双引号。双引号和嵌入在元素值中的反斜杠将被反斜杠转义。