127

尝试将转义字符插入表中会导致警告。

例如:

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

有谁知道如何解决这个问题?

4

5 回答 5

146

部分。文本已插入,但仍会生成警告。

我发现一个讨论表明文本需要以'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');
于 2008-08-04T01:07:03.233 回答
44

凉爽的。

我还找到了有关 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,其中 digits 表示八进制字节值,以及 \xhexdigits,其中 hexdigits 表示十六进制字节值。(您有责任确保您创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后面的任何其他字符都按字面意思表示。因此,要包含反斜杠字符,请编写两个反斜杠 (\\)。此外,除了通常的 '' 之外,还可以通过写 \' 将单引号包含在转义字符串中。

于 2008-08-04T01:14:57.367 回答
6

发出警告是因为您在字符串中使用了反斜杠。如果您想避免该消息,请键入此命令“set standard_conforming_strings=on;”。然后在您的字符串之前使用“E”,包括您希望 postgresql 解释的反斜杠。

于 2010-02-16T23:51:23.200 回答
3

我发现 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=>
于 2008-09-19T19:24:55.850 回答
0

非常愚蠢的问题:您确定字符串被截断,而不仅仅是在您指定的换行符处中断(并且可能没有显示在您的界面中)?即,您是否希望该字段显示为

这将被插入 \n 这不会

或者

这将被插入

这不会是

另外,你用的是什么接口?有没有可能有东西在吃你的反斜杠?

于 2008-09-16T13:26:04.093 回答