Postgreql 中的字符串文字和转义字符

试图向表中插入转义字符将导致警告。

例如:

create table EscapeTest (text varchar(50));


insert into EscapeTest (text) values ('This is the first part \n And this is the second');

产生警告:

WARNING:  nonstandard use of escape in a string literal

(使用 PSQL 8.2)

有人知道怎么解决吗?

334201 次浏览

部分。虽然插入了文本,但仍然会生成警告。

我发现一个讨论表明文本前面需要加上“ 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');

酷。

我还找到了关于 E 的文件:

Http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#sql-syntax-strings

PostgreSQL 还接受“ escape”字符串常量,这是 SQL 标准的扩展。转义字符串常量是通过在开始的单引号前写入字母 E (大写或小写)来指定的,例如 E‘ foo’。(当跨行继续使用转义字符串常量时,只在第一个引号前写 E。)在转义字符串中,反斜杠字符()开始一个类似于 C 的反斜杠转义序列,其中反斜杠和后面的字符组合表示一个特殊的字节值。B 是退格,f 是换行符,n 是换行符,r 是回车符,t 是制表符。还支持数字(其中数字表示八进制字节值)和十六进制数字(其中十六进制表示十六进制字节值)。(您的责任是创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后面的任何其他字符都是字面意义上的。因此,要包含反斜杠字符,需要写两个反斜杠()。此外,除了通常的方法“’外,还可以通过写入’将单个引号包含在转义字符串中。

非常愚蠢的问题: 您确定字符串被截断了,而不是在您指定的换行符处被破坏了(并且可能没有显示在您的接口中) ?也就是说,你希望这个领域显示为

这将被插入 n 这将不会 是

或者

这将被插入

不会的

还有,你用的是什么界面? 有没有可能是什么东西一直在侵蚀你的反斜杠?

我发现 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=>

由于在字符串中使用反斜杠,因此会发出此警告。如果希望避免该消息,请键入以下命令“ set standard _ conform _ string = on;”。然后在字符串前面使用“ E”,包括您希望 postgreql 解释的反斜杠。