Postgresql COPY 文本值包含 \0(反斜杠 0)

PAR*_*PAR 3 postgresql text escaping backslash psql

设置:Postgresql Server 9.3 - 操作系统:CentOS 6.6

尝试使用 COPY 命令将 2.5 亿条记录批量插入到 Postgresql 9.3 服务器中。数据采用管道“|”分隔格式 作为分隔符。

我要复制到的表中几乎所有列都是 TEXT 数据类型。不幸的是,在 2.5 亿条记录中,大约有 200 万条具有文本中包含“\0”的合法文本值。

示例条目:

245150963|数据源|736778|XYZNR-1B5.1|1984年12月10日00:00:00|||XYZNR-1B5.1\1984-12-10\0.5\1\ASDF1|pH|物理|水|XYZNR |河口

正如您所看到的,第 8 列的值中有一个合法的 \0。

XYZNR-1B5.1\1984-12-10\0.5\1\ASDF1

无论我如何逃避这个问题,COPY 命令都会将此 \0 转换为实际的“\x0”,或者 COPY 命令失败并显示“错误:编码“UTF8”的字节序列无效:0x00”。

我尝试用“sed -i”替换 \0:

\\0
\\\0
'\0'
\'\'0
\\\\\0
Run Code Online (Sandbox Code Playgroud)

...还有许多其他我不记得了,但它们都不起作用。

这些类型的字符串的正确转义是什么?

谢谢!

muj*_*imu 5

根据COPY上的 Postgres 文档:

可以在 COPY 数据中使用反斜杠字符 () 来引用可能被视为行或列分隔符的数据字符。特别是,如果以下字符作为列值的一部分出现,则必须在其前面添加 反斜杠:反斜杠本身、换行符、回车符和当前分隔符。

尝试将字段中该路径中的所有反斜杠字符转换为 \\,而不仅仅是 \0。

仅供参考 \b 也是反斜杠的简写。

因此,其中任何一个都应该有效:

XYZNR-1B5.1\b1984-12-10\b0.5\b1\bASDF1
XYZNR-1B5.1\\1984-12-10\\0.5\\1\\ASDF1