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

文本值包含\0(反斜杠0)的Postgresql副本,postgresql,text,escaping,psql,backslash,Postgresql,Text,Escaping,Psql,Backslash,安装程序: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

安装程序: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列的值中有一个合法的\0

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

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

我已尝试将\0替换为“sed-I”,替换为:

。。。还有很多我不记得了,但都不管用

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

谢谢

每名博士后的博士学位:

反斜杠字符()可用于将数据复制到报价数据中 可能以其他方式作为行或列分隔符的字符。 特别是,以下字符前面必须加一个 反斜杠如果它们作为列值的一部分出现:反斜杠本身, 换行符、回车符和当前分隔符字符

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

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

因此,这两种方法中的任何一种都应该有效:

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


您是否确认您的
sed
命令实际上为您提供了
\\0

您需要的是您没有提供的一个示例:

sed -e 's/\\/\\\\/g'
您希望所有出现的
\
都使用此选项,而不仅仅是
\0

从文件和postgres的角度来看,我们试图将
\
转换为
\


sed
中,
\
是一个我们需要自我转义的特殊字符,因此
\
变成
\\
,而
\\
变成
\\\\\
,因此出现了上述表达式。

我以前从未听说过\b,所以我立即尝试了。不幸的是,当COPY命令成功完成插入的数据时,结果是:XYZNR-EE2.2\x081984-12-13\x080\x081\x08S-ASDF1。正如我上面所说的,我尝试了\\方法做事情,结果也和\b一样。谢谢你的建议!您是否尝试在您的副本上提供一个带NULL参数的?我也有同样的问题,您找到解决方案了吗?
sed -e 's/\\/\\\\/g'