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

时间:2008-08-04 01:00:25

标签: string postgresql escaping

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

例如:

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

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

5 个答案:

答案 0 :(得分:113)

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

我发现了一个讨论,表明文本需要以“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');

答案 1 :(得分:35)

冷却。

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

答案 2 :(得分:6)

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

答案 3 :(得分: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=>

答案 4 :(得分:2)

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

  

这将被插入\ n这不会   是

  

将插入

     

这不会是

另外,您使用的界面是什么?沿途有什么东西可能会吃掉你的反斜杠吗?