PostgreSQL中的字符串字面量和转义字符

guicsvcw  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(5)|浏览(225)

尝试在表中插入转义符将导致警告。
举例来说:

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*)
有谁知道怎么绕过这个?

jyztefdp

jyztefdp1#

部分。插入文本,但仍生成警告。
我发现一个讨论表明文本需要在“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');

9ceoxa92

9ceoxa922#

酷了
我还找到了有关E:
http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS
引用格式由“Randall”提供
PostgreSQL还接受“转义”字符串常量,这是SQL标准的扩展。(大写或小写),例如E'foo'。(当跨行继续转义字符串常量时,请仅在第一个左引号前写入E.)在转义字符串中,反斜杠字符(\)开始一个类似C的反斜杠转义序列,其中反斜杠和后面的字符的组合表示一个特殊的字节值:
\b是退格,
\f是换页机,
\n是换行符,
\r是回车,
\t是一个选项卡。
还支持
\,其中表示八进制字节值,以及 `\x `<hexdigits>,其中<hexdigits>表示十六进制字节值。
(It您有责任确保所创建的字节序列是服务器字符集编码中的有效字符。)
反斜扛后面的任何其他字符都是字面上的。因此,若要包含反斜扛字符,请写入两个反斜扛(\)。此外,除了''的一般方式之外,也可以写入',以将单引号包含在逸出字串中。

dohp0rv5

dohp0rv53#

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

mec1mxoz

mec1mxoz4#

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

字符串

ogq8wdun

ogq8wdun5#

非常愚蠢的问题:你确定字符串被截断了,而不是在你指定的换行符处被截断了(而且可能没有显示在你的界面中)?
这将被插入\n这将不会

这将被插入
这不会是
还有,你使用的是什么接口?有没有可能是沿着的东西在吞噬你的反斜杠?

相关问题