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


113

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

例如:

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

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

Answers:


131

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

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

5
请注意,在PostgreSQL 9.0上,E'testing \\ x20double-slash'的评估结果为'testing \\ x20double-slash',因此,仅单斜杠方法适用于E'string'样式的文字
亚历山大(Alexander)

2
对于PostgreSQL 9.2,请参阅:postgresql.org/docs/9.2/interactive/…–
Pitt

psql \copy注意:我在psql的\ copy复制命令的查询参数中使用该E'\n'文件时,发现它是'\n'作为换行而不是换行符写入的。

40

凉。

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


6

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


1
并不是的。如果我使用standard_conforming_strings = on并运行命令\copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f',则会得到parse error at "'\x7f'"。如果我有standard_conforming_strings = off; 并使用上面没有E和引号的同一命令...(DELIMITER AS \ x7f)我收到警告消息,但数据加载正常。因此,您的陈述可能是正确的,但在这种情况下不正确。

当您现在使用psql命令时,我指的是SQL语句中的字符串。使用COPY命令而不是\ copy会得到相同的错误吗?
eppesuig 2011年

1
这是正确的答案。PG的现代版本现在默认为启用它。
jpmc26

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=>

请尝试我给的测试用例,您将自己看到它。
rjohnston

有趣的是,问题似乎出在JDBC驱动程序中,因为从数据库出来的文本肯定被截断了……
rjohnston

3
在某些非常特殊的情况下,Postgres 截断输入中的数据。例如,character varying(4)给定输入“ test” 的列(单词后两个空格,六个字符)将截断空格并存储值“ test”。但是,作为一般规则,您可以假设Postgres将出错而不是截断数据。
布赖森2014年

0

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

这将被插入\ n这将不会

要么

这将被插入

这不会

另外,您在使用什么接口?一路走来有可能吃了您的反斜杠吗?


1
这件事发生在我身上。文本被插入文本框中,查看了源代码,并且肯定有引号并且整个文本都存在,只是不可见
roberthuttinger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.