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

在postgresql表中存储带有引号或反斜杠等特殊字符的字符串,sql,postgresql,Sql,Postgresql,我有一个带值的字符串 'MAX DATE QUERY:选择iso_timestamp(MAX(time_stamp))作为观察中的MAXTIME,其中providing_id='HOBART' 但在插入到postgresql表时,我得到了一个错误: org.postgresql.util.psqleexception:错误:位于或接近“HOBART”的语法错误 这可能是因为我的字符串包含单引号。我不知道我的字符串值。每次我从文件中读取并保存到postgres数据库时,它都会不断变化,可能会包含\

我有一个带值的字符串

'MAX DATE QUERY:选择iso_timestamp(MAX(time_stamp))作为观察中的MAXTIME,其中providing_id='HOBART'

但在插入到postgresql表时,我得到了一个错误:

org.postgresql.util.psqleexception:错误:位于或接近“HOBART”的语法错误

这可能是因为我的字符串包含单引号。我不知道我的字符串值。每次我从文件中读取并保存到postgres数据库时,它都会不断变化,可能会包含\之类的特殊字符


请给出转义这些字符的一般解决方案。

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

insert into table (column) values ('I''m OK')
如果用两个单引号替换文本中的每一个单引号,它将起作用

通常,反斜杠转义下列字符,但文字反斜杠同样通过使用两个反斜杠转义“


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

请阅读和

由于反斜杠存在问题,不仅仅是
“单引号”
,我想说您运行的是PostgreSQL 9.0或更旧版本,默认为
标准字符串=off
。在较新版本中,只有在使用PostgreSQL扩展名
E'escape strings'
时,反斜杠才是特殊的。(这就是为什么您总是在问题中包含PostgreSQL版本的原因)

您可能还需要检查:

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

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


如果你真的必须手动转义字符串,你需要确保
标准字符串
处于打开状态,并且使用双引号,例如
不要手动转义文本
;或者在反斜杠转义时使用PostgreSQL特有的
E'转义字符串。
。但是,实际上,使用准备好的语句,这更容易。

一些可能的办法是:

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

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

    您可以使用此方法对字符串中的特殊字符进行转义。 上面提到的查询
    插入表(列)值('I'm OK')

    插入表(列)值($$I'm OK$$)的更改

    要使标识符唯一,以便它不会与值混合,您可以添加2美元之间的任何字符,例如
    插入表(列)值($aesc6$I'm OK$aesc6$)


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

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

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

    实现这一点的最佳方法取决于您的数据库API。这是手动输入控制台的查询,还是您可以使用编程语言中准备好的语句API?如果您想知道“为什么所有的反对票都被否决了”,我实际上投了您的赞成票(因为我认为所有的反对票都有点过头了)但我想说的原因是:搜索很容易回答常见问题;没有显示您的代码;没有显示PostgreSQL版本;没有先进行任何搜索的迹象。实际上,我不知道下一个字符串值是什么。让我解释一下。我使用以下查询:插入日志(日期、日志、级别、消息)值('%d{yyyyy-MM-dd HH:MM:ss.SSS}','%C','%p','%m')。在这里我不知道消息字符串的值。那么我如何再添加一个单引号来转义另一个单引号。我正在从文件读取并输入消息列。使用反斜杠转义字符的可能重复项已被弃用(因为它是非标准的)并且在当前的Postgres版本中被禁用。
    'Look in C:\Temp'
    可以很好地工作。@horse\u没有名字说仍然可以使用双反斜杠。你有链接吗?@Bohemian它还说你必须使用
    E''
    样式字符串在链接到的页面上启用C样式反斜杠转义。通常
    标准ng_strings
    已打开,并且您使用常规SQL标准引号加倍。请参阅第4.1.2.2章(在您发布的链接中)中的“小心”块实际上,我不知道我的下一个字符串值是什么。让我解释一下。我使用以下查询:插入日志(日期、日志、级别、消息)值(“%d{yyyyy-MM-dd HH:MM:ss.SSS}“,'%C','%p','%m')。在这里我不知道消息字符串的值。那么我将如何再添加一个单引号以转义另一个单引号。我正在从文件中读取并进入消息列。
    update table set stringField = N'/;l;sldl;'''mess'