安装程序:Postgresql Server 9.3-操作系统:CentOS 6.6
尝试使用COPY命令将2.5亿条记录批量插入Postgresql 9.3服务器。数据采用分隔格式,使用管道“|”作为分隔符。
我要复制到的表中几乎所有列都是文本数据类型。不幸的是,在2.5亿条记录中,大约有200万条具有合法文本值,文本中带有“\0”。
示例条目:
245150963 |数据源| 736778 | XYZNR-1B5.1 | 10-DEC-1984 00:00:00 | | XYZNR-1B5.1\1984-12-10\0.5\1\ASDF1 | pH |物理|水| XYZNR |河口
如您所见,第8列的值是合法的。
XYZNR-1B5.1\1984-12-10\0.5\1\ASDF1
无论我如何转义,COPY命令都会将此\0转换为实际的“\x0”,或者COPY命令失败,并显示“错误:编码“UTF8”:0x0 0的字节序列无效”。
我已尝试用“sed-I”替换\0,替换为:

\\0
\\\0
'\0'
\'\'0
\\\\\0

... 还有很多我记不起来的东西,都不管用。
这类字符串的正确转义是什么?
谢谢!

最佳答案

根据COPY上的博士后医生:
反斜杠字符()可用于复制数据以引用数据
可以作为行或列分隔符的字符。
特别是,以下字符前面必须有
反斜杠如果它们作为列值的一部分出现:反斜杠本身,
换行符、回车符和当前分隔符。
尝试将字段中该路径中的所有反斜杠字符转换为“\”,而不仅仅是“0”。
仅供参考,反斜杠也是缩写。
所以这两种方法都应该有效:
XYZNR-1B5.1\b1984-12-10\b0.5\b1\bASDF1
XYZNR-1B5.1\\ 1984-12-10\\ 0.5\\ 1\\ ASDF1

09-06 18:20