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

时间:2013-07-03 06:46:51

标签: 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数据库。

请提供一般解决方案以逃避此类角色。

5 个答案:

答案 0 :(得分:10)

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

insert into table (column) values ('I''m OK')

如果使用两个单引号替换文本中的每个单个引号,它都会有效。

通常情况下,反斜杠会转义后续字符,但使用两个反斜杠"

会对文字反斜杠进行类似的转义。
insert into table (column) values ('Look in C:\\Temp')

答案 1 :(得分:5)

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

请阅读prepared statements section of the JDBC tutorialthese simple examples in various languages including 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'。但实际上,使用预处理语句会更容易。

答案 2 :(得分:4)

您可以使用double dollar quotation来转义字符串中的特殊字符。 上面提到的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 $是唯一的字符串标识符,因此即使$$是值的一部分,它也将被视为值而不是标识符。

答案 3 :(得分:0)

一些可能的方法是:

  1. 使用预备陈述
  2. 将所有特殊字符转换为等效的html实体。
  3. 在存储字符串时使用base64编码,在从db表中读取字符串时使用base64解码。
  4. 方法1(准备好的陈述)可以与方法2和3结合使用。

    方法3(base64编码)将所有字符转换为十六进制字符,而不会丢失任何信息。但是您可能无法使用此方法进行全文搜索。

答案 4 :(得分:0)

SQLServer 中的文字以N开头,如下所示:

update table set stringField = N'/;l;sldl;'''mess'