在postgresql表中存储带有引号或反斜杠等特殊字符的字符串

sho*_*aik 6 sql postgresql

我有一个有价值的字符串

'MAX DATE QUERY: SELECT iso_timestamp(MAX(time_stamp)) AS MAXTIME FROM observation WHERE offering_id = 'HOBART''

但在插入postgresql表时我收到错误:

org.postgresql.util.PSQLException:错误:"HOBART"处或附近的语法错误.

这可能是因为我的字符串包含单引号.我不知道我的字符串值.每次它不断变化,并且可能包含特殊字符,例如\或者某些东西,因为我正在从文件中读取并保存到postgres数据库中.

请提供一般解决方案来逃避这些角色.

Boh*_*ian 11

根据SQL标准,引号通过加倍来分隔,即:

insert into table (column) values ('I''m OK')
Run Code Online (Sandbox Code Playgroud)

如果更换每一个与你的文字报价2个单引号,它会工作.

通常,反斜杠会转义后续字符,但使用两个反斜杠同样转义文字反斜杠"

insert into table (column) values ('Look in C:\\Temp')
Run Code Online (Sandbox Code Playgroud)


San*_*ija 11

您可以使用双美元引号来转义字符串中的特殊字符。上面提到的查询insert into table (column) values ('I'm OK')

更改为insert into table (column) values ($$I'm OK$$).

要使标识符唯一以使其不与值混合,您可以在 2 美元之间添加任何字符,例如
insert into table (column) values ($aesc6$I'm OK$aesc6$).

这里 $aesc6$ 是唯一的字符串标识符,因此即使 $$ 是值的一部分,它也会被视为值而不是标识符。


Cra*_*ger 5

您似乎正在使用Java和JDBC.请阅读JDBC教程,该教程描述了如何使用参数化查询安全地插入数据而不会有SQL注入问题的风险.

请阅读JDBC教程预备语句部分以及包括Java在内的各种语言的这些简单示例.

由于你遇到反斜杠的问题,不仅仅是'single quotes',我说你正在运行PostgreSQL 9.0或更早版本,默认情况下standard_conforming_strings = off.在较新的版本中,如果您使用PostgreSQL扩展,则反斜杠只是特殊的E'escape strings'.(这就是为什么你总是在问题中包含你的PostgreSQL版本).

您可能还想检查:

虽然可以明确地引用值,但这样做容易出错,速度慢且效率低.您应该使用参数化查询(预准备语句)来安全地插入数据.

将来,请包含您遇到问题的代码段以及您正在使用的语言的详细信息,PostgreSQL版本等.

如果你真的必须手动转义字符串,你需要确保它standard_conforming_strings是打开和双引号,例如don''t manually escape text; 或使用PostgreSQL特定的E'escape strings where you \'backslash escape\' quotes'.但实际上,使用准备好的语句,它更容易.