8

I have a string with value

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

But on inserting into postgresql table i am getting error:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "HOBART".

This is probably because my string contains single quotes. I don't know my string value. Every time it keeps changing and may contain special characters like \ or something since I am reading from a file and saving into postgres database.

Please give a general solution to escape such characters.

4

5 回答 5

12

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

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

如果将文本中的每个单引号替换为两个单引号,它将起作用。

通常,反斜杠转义后面的字符,但文字反斜杠类似地通过使用两个反斜杠进行转义"

insert into table (column) values ('Look in C:\\Temp')
于 2013-07-03T06:49:32.007 回答
12

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

于 2014-07-18T12:49:41.010 回答
5

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

请阅读JDBC 教程的准备语句部分以及这些用各种语言(包括 Java)编写的简单示例

由于您遇到反斜杠问题,而'single quotes'不仅仅是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'. 但实际上,使用准备好的语句,它更容易。

于 2013-07-03T07:03:42.187 回答
1

一些可能的方法是:

  1. 使用准备好的语句
  2. 将所有特殊字符转换为其等效的 html 实体。
  3. 在存储字符串时使用 base64 编码,在从 db 表中读取字符串时使用 base64 解码。

方法 1(准备好的语句)可以与方法 2 和 3 结合使用。

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

于 2014-03-23T17:40:59.163 回答
-1

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

update table set stringField = N'/;l;sldl;'''mess'
于 2017-01-31T00:18:03.370 回答