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

Translate

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

例如:

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)

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

我发现有一个讨论表明该文本必须以'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');
来源
Translate

凉。

我还找到了有关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(其中十六进制数字代表十六进制字节值)。 (由您负责创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后的所有其他字符均按字面意义使用。因此,要包含反斜杠字符,请写两个反斜杠(\\)。另外,除了常规的''之外,还可以通过写\'将单引号包含在转义字符串中。

来源
Translate

由于在字符串中使用反斜杠,因此发出警告。如果要避免出现此消息,请键入此命令“ set standard_conforming_strings = on;”。然后在您的字符串(包括您希望Postgresql解释的反斜杠)之前使用“ E”。

来源
Translate

我发现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=>
来源
Meroy Lee
Translate

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

这将被插入\ n这将不会

要么

这将被插入

这不会

另外,您在使用什么接口?一路上是否有东西在吃反斜杠?

来源