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

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

例如:

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

任何人都知道如何解决这个问题?

0
额外 编辑
意见: 2

4 答案

凉。

我还发现有关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代表一个十六进制字节值。 (您所负责的是您创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后面的任何其他字符都是从字面上进行的。因此,要包含反斜杠字符,请写两个反斜杠(\\)。此外,除了''的普通方式之外,还可以通过书写\'将单引号包含在转义字符串中。
0
额外

部分。文本被插入,但警告仍然生成。

我发现一个讨论表明文本需要以'E'开头,因此:

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

这抑制了警告,但文字仍未正确返回。当我按照Michael的建议添加额外的斜线时,它就起作用了。

因此:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
0
额外
请注意,在PostgreSQL 9.0中,E'testing \\ x20double-slash'将评估为'testing \\ x20double-slash',因此只有单斜线方法适用于E'string'样式文字
额外 作者 Alexander,
对于PostgreSQL 9.2请参阅: postgresql .ORG /文档/ 9.2 /互动/…
额外 作者 Pitt,
psql \ copy 注意:我发现 E'\ n'是作为'\ n'写入文件的,而不是作为换行符在psql的`\ copy'元命令的查询参数中使用它。
额外 作者 Stew,

我发现Postgres不太可能在输入时截断你的数据 - 它要么拒绝它,要么按原样存储它。

[email protected]:~$ 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=>
0
额外
请尝试我给的测试用例,你会亲自看到它。
额外 作者 rjohnston,
有趣的是,看起来问题出现在JDBC驱动程序中,因为从数据库中传出的文本被截断了。
额外 作者 rjohnston,
在一些非常特殊的情况下,Postgres 不会截断输入数据。例如,给定输入“测试”(字之后的两个空格,6个字符)的字符变化(4)列将截断空格并存储值“test”。然而,一般来说,你可以假设Postgres会出错而不是截断你的数据。
额外 作者 Bryson,

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

0
额外
我指的是SQL语句中的字符串,而您现在正在使用psql命令。使用COPY命令而不是\ copy会得到相同的错误吗?
额外 作者 eppesuig,
这是正确的答案。 PG的现代版本现在默认启用它。
额外 作者 jpmc26,