将带有单引号的字符串从 Java 插入 Postgresql

Posted

技术标签:

【中文标题】将带有单引号的字符串从 Java 插入 Postgresql【英文标题】:Inserting string with single quotes from Java into Postgresql 【发布时间】:2010-10-31 12:12:46 【问题描述】:

我正在将 Java 应用程序中的文本插入 Postgresql 数据库,但是当在字符串中遇到 ' 字符时,它都会崩溃。我试过使用 replaceAll(" ' ", " \\' ");甚至它的不同变体带有更多 \ 字符,但它仍然在没有转义符号的字符串中放置一个 '。

有什么方法可以将字符串中的 ' 替换为 \' 吗?或者另一种将包含单引号的字符串放入 Postgresql 的方法?

【问题讨论】:

我有一个类似的问题,我正在使用休眠查询,当尝试插入一个字段是否包含单引号时,会引发异常 【参考方案1】:

如果您正确使用prepared statements,则不必担心手动执行此操作。

【讨论】:

+1 表示准备好的语句。这些确实是做到这一点的正确方法。 +1 也用于我的准备好的陈述。小心将自己暴露在 SQL 注入攻击之下。 谢谢你,我听从了你的建议,把它改成了一个适当的准备好的声明,结果我用错了。这也解决了问题。 我建议将已接受的答案移至此答案。这样其他人就会首先看到正确的解决方案。单引号转义并没有错,但构建这样的 SQL 字符串通常不是一个好习惯。 当我使用 hibernate saveOrUpdate(Object) 时,我该如何解决类似的问题,如果 Object 中的 String 字段之一包含单引号,则查询和问题发生【参考方案2】:

大多数 SQL 实现使用 ''(2 个单引号)来转义单引号。

例子:

SELECT * FROM users WHERE f_name='foo''bar';

或者你可以使用双美元符号:

例子:

SELECT * FROM users WHERE f_name=$$foo''bar$$;

两个语句都会搜索字符串 foo'bar

【讨论】:

是的,这是标准 SQL 的一个特性,PostgreSQL 支持这个。见postgresql.org/docs/current/static/… 但是你仍然想使用绑定变量和准备好的语句。 我同意准备好的陈述是要走的路。但有时遗留代码会让你选择你的战斗。 我怀疑遗留代码在这里是个问题。 PostegreSQL 有一个 JDBC 驱动程序。

以上是关于将带有单引号的字符串从 Java 插入 Postgresql的主要内容,如果未能解决你的问题,请参考以下文章

在字符串字段中使用带有单引号的 CSV 文件插入会导致错误

如何向数据库插入带有单引号(')的字符串?--在做数据插入是一定要考虑,否则有单引号系统就会报错

JAVA在数据库中插入日期,日期由字符串变量传递值,占位符?要用单引号吗,怎么写?

关于js生成的字符串带有单双引号嵌套的问题

如何插入包含单引号的字符串

如何用sql语句插入一个带有单引号的值