将带有特殊字符(如引号或反斜杠)的字符串存储在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数据库中。

请给出一个通用的解决方案来转义这些字符。

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

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

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

通常,反斜杠会转义以下字符,但文字反斜杠也可以通过使用两个反斜杠""进行类似的转义

insert into table (column) values ('Look in C:\Temp')

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

改变为CCD_ 3。

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

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

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

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

由于您遇到反斜杠问题,而不仅仅是'single quotes',我认为您运行的是PostgreSQL 9.0或更高版本,默认为standard_conforming_strings = off。在较新版本中,只有使用PostgreSQL扩展E'escape strings'时,反斜杠才是特殊的。(这就是为什么总是在问题中包含PostgreSQL版本)。

你可能还想检查一下:

  • 为什么你应该使用事先准备好的陈述。

  • 关于SQL查询的词法结构的PostgreSQL文档。

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

将来,请包含一个您有问题的代码片段,以及您使用的语言、PostgreSQL版本等的详细信息。

如果您真的必须手动转义字符串,则需要确保standard_conforming_strings处于启用状态并使用双引号,例如don''t manually escape text;或者使用PostgreSQL特定的CCD_ 10。但实际上,使用事先准备好的语句要容易得多。

一些可能的方法是:

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

方法1(准备好的发言)可以与方法2和方法3相结合。

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

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

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

相关内容

最新更新