Answers:
部分地。插入了文本,但是仍然生成警告。
我发现有一个讨论表明该文本必须以'E'开头,例如:
insert into EscapeTest (text) values (E'This is the first part \n And this is the second');
这样可以抑制警告,但是仍无法正确返回文本。当我按照迈克尔的建议添加额外的斜杠时,它起作用了。
因此:
insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
psql \copy
注意:我在psql的\ copy复制命令的查询参数中使用该E'\n'
文件时,发现它是'\n'
作为换行而不是换行符写入的。
凉。
我还找到了有关E的文档:
http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS
PostgreSQL还接受“转义”字符串常量,这是SQL标准的扩展。通过在开头的单引号之前写字母E(大写或小写)来指定转义字符串常量,例如E'foo'。(当跨行继续使用转义字符串常量时,请仅在第一个开始的引号之前写E。)在转义字符串中,反斜杠字符(\)开始一个类似于C的反斜杠转义序列,其中反斜杠和后跟字符( s)代表一个特殊的字节值。\ b是退格键,\ f是换页符,\ n是换行符,\ r是回车符,\ t是制表符。还支持\ digits(其中数字代表八进制字节值)和\ xhexdigits(其中十六进制数字代表十六进制字节值)。(由您负责的是,您创建的字节序列在服务器字符集编码中是有效字符。)反斜杠后的所有其他字符均按字面意义使用。因此,要包含反斜杠字符,请写两个反斜杠(\\)。另外,除了常规的''之外,还可以通过写\'将单引号包含在转义字符串中。
由于在字符串中使用反斜杠,因此发出警告。如果要避免出现此消息,请键入此命令“ set standard_conforming_strings = on;”。然后在您的字符串(包括您希望Postgresql解释的反斜杠)之前使用“ E”。
\copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f'
,则会得到parse error at "'\x7f'"
。如果我有standard_conforming_strings = off; 并使用上面没有E和引号的同一命令...(DELIMITER AS \ x7f)我收到警告消息,但数据加载正常。因此,您的陈述可能是正确的,但在这种情况下不正确。
我发现Postgres不太可能在输入时截断您的数据-它要么拒绝它,要么原样存储它。
milen@dev:~$ psql
Welcome to psql 8.2.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING: nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
^
HINT: Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1
milen=> select * from EscapeTest;
text
------------------------
This will be inserted
This will not be
(1 row)
milen=>
character varying(4)
给定输入“ test” 的列(单词后两个空格,六个字符)将截断空格并存储值“ test”。但是,作为一般规则,您可以假设Postgres将出错而不是截断数据。
真正愚蠢的问题:您确定字符串被截断了,而不仅仅是在指定的换行符处中断了(并且可能未在界面中显示)吗?即,您希望该字段显示为
这将被插入\ n这将不会
要么
这将被插入
这不会
另外,您在使用什么接口?一路走来有可能吃了您的反斜杠吗?