MySQL Prepared Statement

摘要:在本教程中,您将学习如何使用MySQL 准备好的语句来使您的查询执行得更快、更安全。

MySQL准备语句简介

在 MySQL 4.1 之前的版本中,查询以文本格式发送到 MySQL 服务器。反过来,MySQL 使用文本协议将数据返回给客户端。 MySQL 必须完全解析查询并将结果集转换为字符串,然后再将其返回给客户端。

文本协议具有严重的性能影响。为了解决这个问题,MySQL从4.1版本开始添加了一个新功能,称为prepared statements。

准备好的语句利用了客户端/服务器二进制协议。它将包含占位符 ( ? ) 的查询传递到 MySQL 服务器,如下例所示:

SELECT * 
FROM products 
WHERE productCode = ?;Code language: SQL (Structured Query Language) (sql)

当 MySQL 使用不同的productcode值执行此查询时,它不必完全解析该查询。因此,这有助于 MySQL 更快地执行查询,特别是当 MySQL 多次执行同一查询时。

由于准备好的语句使用占位符 ( ? ),这有助于避免 SQL 注入的许多变体,从而使您的应用程序更加安全。

MySQL 准备语句用法

为了使用 MySQL 准备好的语句,您需要使用以下三个语句:

  • PREPARE – 准备要执行的语句。
  • EXECUTE – 执行由PREPARE语句准备的准备好的语句。
  • DEALLOCATE PREPARE – 释放准备好的语句。

下图说明了如何使用准备好的语句:

MySQL 准备语句

MySQL 准备语句示例

让我们看一下使用 MySQL 准备语句的示例。以下示例将使用示例数据库中的products表。

首先,准备一条返回产品代码和产品代码指定的产品名称的语句:

PREPARE stmt1 FROM 
	'SELECT 
   	    productCode, 
            productName 
	FROM products
        WHERE productCode = ?';Code language: SQL (Structured Query Language) (sql)

其次,声明一个名为pc的变量,代表产品代码,并将其值设置为'S10_1678'

SET @pc = 'S10_1678'; 
Code language: SQL (Structured Query Language) (sql)

三、执行准备好的语句:

EXECUTE stmt1 USING @pc;Code language: SQL (Structured Query Language) (sql)
MySQL 准备语句示例 1

第四,为 pc 变量分配另一个产品代码:

SET @pc = 'S12_1099';Code language: SQL (Structured Query Language) (sql)

第五,使用新产品代码执行准备好的语句:

EXECUTE stmt1 USING @pc;Code language: SQL (Structured Query Language) (sql)

最后,发布准备好的声明:

DEALLOCATE PREPARE stmt1;Code language: SQL (Structured Query Language) (sql)

在本教程中,您学习了如何使用 MySQL 准备好的语句来使查询执行得更快、更安全。

本教程有帮助吗?