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

String postgresql中的字符串文字和转义字符,string,postgresql,escaping,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) 有人知道如何避开这个问题吗?部分

试图在表中插入转义字符将导致警告

例如:

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)


有人知道如何避开这个问题吗?

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

我发现一个讨论表明文本前面需要加上“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');

我还找到了有关E:

PostgreSQL还接受“转义”字符串常量,这是SQL标准的扩展。转义字符串常量是通过在开头单引号前写字母E(大写或小写)来指定的,例如E'foo'。(当跨行继续一个转义字符串常量时,只在第一个开头引号前写E。)在转义字符串中,反斜杠字符(\)开始一个类似C的反斜杠转义序列,其中反斜杠和后面字符的组合表示一个特殊的字节值\b是退格,\f是换行符,\n是换行符,\r是回车符,\t是制表符。还支持\digits(其中数字表示八进制字节值)和\xhexdigits(其中hexdigits表示十六进制字节值)。(您有责任确保您创建的字节序列是服务器字符集编码中的有效字符。)反斜杠后面的任何其他字符都是按字面理解的。因此,要包含反斜杠字符,请写入两个反斜杠(\\)。此外,除了通常的“”方式外,还可以通过写入\'将单引号包含在转义字符串中


非常愚蠢的问题:您确定字符串正在被截断,而不仅仅是在您指定的换行符处被打断(并且可能没有显示在您的界面中)?也就是说,你认为这个领域会显示出

这将被插入\n这不会 是

这将被插入

这是不可能的


另外,您使用的是什么界面?有没有可能有什么东西正在侵蚀你的反斜杠?

我发现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=>

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

请尝试我给出的测试用例,您将自己看到它。有趣的是,问题似乎出在JDBC驱动程序中,因为从数据库出来的文本肯定被截断了…Postgres在某些非常特殊的情况下会截断输入数据。例如,给定输入“test”(单词后面的两个空格,6个字符)的
字符变化(4)
列将截断空格并存储值“test”。然而,一般来说,你可以假设Postgres会出错,而不是截断你的数据。如果我的标准字符串为on,并运行命令
\copy xxxxxxxxxx FROM/support01/db/data/xxxxxxxxx\u 7F.txt分隔符作为E'\x7f'
,我会在“'\x7f'处得到
解析错误。如果我有标准\u一致性\u字符串=关闭;使用上面相同的命令,不带E和引号。。。(分隔符为\x7f)我收到警告消息,但数据加载正常。因此,您的语句可能是正确的,但在本例中并非如此。我指的是SQL语句中的字符串,而您现在使用的是psql命令。使用COPY命令而不是\COPY命令是否会出现相同的错误?这是正确的答案。PG的现代版本现在默认为打开。请注意,在PostgreSQL 9.0上,E“testing\\x20double slash”将计算为“testing\\x20double slash”,因此,对于PostgreSQL 9.2来说,只有单斜杠方法适用于E'string'风格的文字请参见:
psql\copy
注意:我发现
E'\n'
作为
'\n'
写入文件,而不是在psql的`\copy'元命令的查询参数中使用它时作为换行符。这发生在我身上。文本被插入到一个文本框中,查看源代码,果然有一个引号,整个文本都出现了,只是不可见