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

数据库查询中特殊字符(')的传递问题

解决单引号导致SQL查询崩溃的正确姿势

这个问题太常见了!你遇到的本质是直接将用户输入拼接进SQL语句导致的语法错误——比如当用户输入wendy's house时,你拼出来的SQL会是:

WHERE column_name = 'wendy's house'

数据库看到第二个单引号时,会误以为字符串在这里结束,后面的s house'就成了无效的SQL语法,直接触发崩溃,甚至还可能被利用做SQL注入攻击。

下面给你最靠谱的解决办法:

首选方案:使用参数化查询(Prepared Statements)

这是业界公认的标准做法,既安全又能彻底避免这类语法问题。核心思路是把SQL结构和用户输入分开传递,数据库会自动处理输入中的特殊字符,不会破坏SQL语法。

举几个常见编程语言的例子:

Python(以psycopg2为例,PostgreSQL)

# 错误写法:直接拼接会出错
# query = f"SELECT * FROM houses WHERE name = '{user_input}'"

# 正确的参数化写法
user_input = "wendy's house"
query = "SELECT * FROM houses WHERE name = %s"
cursor.execute(query, (user_input,))  # 第二个参数是参数元组

Java(JDBC)

// 错误写法:直接拼接字符串
// String sql = "SELECT * FROM houses WHERE name = '" + userInput + "'";

// 正确的参数化写法
String sql = "SELECT * FROM houses WHERE name = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, userInput);  // 绑定参数
ResultSet rs = stmt.executeQuery();

PHP(PDO)

// 错误写法:直接拼接
// $sql = "SELECT * FROM houses WHERE name = '$user_input'";

// 正确的参数化写法
$user_input = "wendy's house";
$sql = "SELECT * FROM houses WHERE name = :name";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':name', $user_input);
$stmt->execute();

为什么参数化查询是最优解?

  • 语法安全:数据库会自动处理单引号、双引号等特殊字符,不会破坏SQL结构
  • 防SQL注入:彻底杜绝了恶意用户通过输入构造恶意SQL的可能
  • 跨数据库兼容:不用操心不同数据库的转义规则差异(比如MySQL用\',PostgreSQL用'')

次选方案:使用数据库提供的转义函数(不推荐)

如果因为某些限制实在用不了参数化查询,那必须用数据库官方提供的转义函数来处理用户输入,绝对不能自己手动替换单引号(比如把'换成''),因为不同数据库的转义规则不同,手动处理容易遗漏或出错。

比如MySQL的mysqli_real_escape_string:

$user_input = mysqli_real_escape_string($conn, "wendy's house");
$sql = "SELECT * FROM houses WHERE name = '$user_input'";

但再次强调:参数化查询永远是第一选择,转义只是权宜之计。

这样处理后,用户输入的wendy's house会被数据库正确识别为完整的字符串,查询不会崩溃,结果也完全符合用户的搜索需求。

内容的提问来源于stack exchange,提问作者Itay Feldman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:25:15