You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL WHERE子句查询含特殊字符记录的字符串匹配问题

PostgreSQL LIKE查询字符串含特殊字符报错的解决方法

现有写法的问题

你当前的代码存在三个核心问题:

  1. 字符串修改未生效:你所用的编程语言(从语法判断为Java类语言)中String是不可变对象,replace()方法不会修改原变量的值,只会返回处理后的新字符串,你没有接收返回值,相当于转义逻辑完全没有执行。
  2. 转义规则不符合PostgreSQL要求:PostgreSQL遵循标准SQL的单引号转义规则,单引号需要用两个连续单引号转义,你用的反斜杠加单引号的写法是非默认的可选语法,仅在开启standard_conforming_strings = off配置时生效,默认环境下无法正常解析。
  3. 直接拼接原生SQL本身存在SQL注入风险,即使修复了单引号转义,也无法完全规避其他特殊字符带来的安全问题。

可行解决方案

1. 临时修复转义逻辑(仅应急使用,不推荐长期用)

调整代码接收replace返回值,并且使用符合SQL标准的转义规则:

if (name.contains("'")) {
    name = name.replace("'", "''");
}

处理后拼接的SQL会生成where name like 'Papa''s Den'的格式,符合PostgreSQL语法要求。

2. 推荐方案:使用参数化查询(预编译SQL)

完全不需要手动处理任何转义,所有特殊字符会由数据库驱动自动适配处理,同时从根源避免SQL注入风险。以Java JDBC为例:

// 用?作为参数占位符,不要拼接字符串
String querySql = "SELECT * FROM your_table WHERE name LIKE ?";
PreparedStatement statement = conn.prepareStatement(querySql);
// 直接传入原始name值即可,不需要做任何转义处理
statement.setString(1, name);
ResultSet result = statement.executeQuery();

如果你使用MyBatis、JPA等ORM框架,使用框架提供的参数绑定语法(如MyBatis的#{name}),不要用${name}直接拼接字符串,即可自动完成转义。

内容的提问来源于stack exchange,提问作者coco-candy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:54:03