MySQL 预处理语句

2025年3月29日 | 阅读 5 分钟

MySQL 4.1 版本之前,每个查询都以文本格式发送到 MySQL 服务器,并使用文本协议将数据返回给客户端。在将结果返回给客户端之前,MySQL 会完全解析查询并将结果集转换为字符串。这里的解析意味着提交的查询经过语法和语义验证,并且权限也经过验证。

将数据返回给客户端的文本协议存在严重的性能问题。为了克服这个问题,MySQL 从 4.1 版本开始提供了一个名为预处理语句的新功能。

预处理语句或参数化语句用于高效地重复执行相同的语句。它利用了客户端/服务器二进制协议。预处理语句将包含占位符 (?) 的查询传递给 MySQL 服务器。请看下面的示例

当 MySQL 使用不同的 studentId 值执行上述语句时,它无法完全解析该语句。因此,MySQL 将更快地执行该语句,尤其是在多次执行相同查询时。

预处理语句包含占位符 (?),这有助于避免许多 SQL 注入变体,使我们的应用程序更加安全。

预处理语句的优点

以下是 MySQL 中预处理语句的优点

  • 我们可以多次重复执行预处理语句。
  • 每次执行时,都会评估绑定变量的当前值并将其发送到服务器。语句不会再次解析。语句模板不会再次传输到服务器。

预处理语句的基本工作流程

预处理语句的基本工作流程主要包括两个阶段。但是,它有一个可选阶段,总结如下

  1. PREPARE(准备)
  2. EXECUTE(执行)
  3. DEALLOCATE(可选)

PREPARE 阶段

在准备阶段,语句模板被发送到数据库服务器。服务器执行语法检查并初始化内部服务器资源以供以后使用。简而言之,它为执行准备语句。

语法

以下是准备阶段的语法

EXECUTE 阶段

在执行阶段,客户端绑定参数值并将其发送到服务器。服务器根据语句模板和绑定值创建语句,并使用先前创建的内部资源执行它。简而言之,一旦预处理语句准备好查询,我们就可以执行该查询了。

语法

以下是执行预处理语句的语法

DEALLOCATE/DROP 阶段

这是最后一个可选阶段,用于释放预处理语句

语法

以下是释放预处理语句的语法

预处理语句的相关要点

  • 在一个会话中创建的预处理语句对其他会话不可用。这意味着预处理语句是会话特定的。
  • 当会话正常或异常结束时,其预处理语句不再存在于内存中。
  • 在存储程序中创建的预处理语句在程序执行结束后仍然存在,并且以后可以在程序外部执行。

MySQL 预处理语句示例

让我们通过一些示例来了解如何使用 MySQL 预处理语句。

这里,我们将借助 PREPARE 语句直接创建语句,如下所示

接下来,我们将两个值分配给两个变量,这些变量可以用作占位符 (?)。

现在,我们可以借助 EXECUTE 语句执行查询

执行后,我们将得到结果为。请看下图以了解结果

MySQL Prepared Statement

以下示例将使用来自示例数据库的 employee 表,该表包含以下数据。

MySQL Prepared Statement

首先,我们将准备一个语句,该语句返回由员工 id 指定的员工 姓名职位

接下来,我们需要声明一个名为 id 的变量并将其值设置为 '1'

现在,我们可以借助 EXECUTE 语句执行预处理语句

执行后,我们将得到包含员工姓名和职位的结果。请看下图以了解查询执行

MySQL Prepared Statement

再次,我们将为变量 id 分配另一个值

现在,使用新的员工 id 执行预处理语句。我们将看到以下输出

MySQL Prepared Statement

最后,我们可以手动释放预处理语句。但是,当会话关闭时,它们将自动删除。

如果在执行上述查询后尝试执行预处理语句,我们将收到如下错误

MySQL Prepared Statement

如何在存储过程中使用预处理语句?

我们可以通过将其写入 BEGINEND 块中来在存储过程中使用预处理语句。我们可以通过创建一个示例来理解它,该示例通过将表名作为存储过程的参数来返回表中的所有记录。

如下所示创建存储过程

请看下图以执行存储过程

MySQL Prepared Statement

成功创建后,我们可以通过指定表名作为其参数来调用此过程。

它将显示表的所有记录。请看下图

MySQL Prepared Statement

语句 vs 预处理语句

以下是 MySQL 中语句和预处理语句的主要区别

语句预处理语句
当我们只想执行一次 SQL 查询时使用它。当我们想多次执行 SQL 查询时使用它。
它用于 DDL 语句。它可用于任何 SQL 查询。
它不能用于读写二进制数据。它可用于读写二进制数据。
它是静态的,这意味着我们不能在运行时传递参数。它是动态的,这意味着我们可以在运行时传递参数。
执行性能慢。执行性能快。
它不能防止 SQL 注入。它有助于防止 SQL 注入攻击。
它使用文本协议进行通信。它使用二进制协议进行通信。

存储过程 vs 预处理语句

以下是 MySQL 中存储过程和预处理语句的主要区别

Stored Procedure预处理语句
存储过程是访问关系数据库管理系统的 SQL 语句序列。预处理语句是包含占位符而不是实际值的查询。
它可以存储在数据库服务器中。它不能存储在数据库中。

下一主题MySQL 字面量