10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 本手册下载 从本手册中摘录

MySQL 8.0参考手册/SQL语句/准备好的语句

13.5准备好的语句

MySQL 8.0为服务器端准备的语句提供支持。此支持利用了高效的客户端/服务器二进制协议。使用与参数值的占位符的准备好语句有以下优点:

  • 每次执行时解析语句的开销少。通常,数据库应用程序处理大量的几乎 - 相同的语句,只有改变对词素中的文字或变量值在哪里对于查询和删除,更新,价值用于插入物。

  • 防止SQL注入攻击。参数值可以包含未转义的SQL引号和分隔符。

下面几节概述了预备语句的特点:

应用程序中的预处理语句

您可以通过客户端编程接口使用服务器端准备的语句,包括MySQL C API客户端库对于C程序,mysql连接器/ j对于Java程序,和MySQL连接器/净对于使用.NET技术的程序。例如,C API提供了一组构成其准备的语句API的函数调用。看到C API预制语句接口。其他语言接口可以通过在C客户端库中链接来为使用二进制协议的准备语句提供支持,例如mysqli扩展,PHP 5.0和更高版本。

SQL脚本中的准备陈述

可以使用要准备好语句的备用SQL接口。此接口与通过准备的语句API使用二进制协议的界面不高效,但不需要编程,因为它可以直接在SQL级别可用:

  • 当没有可用的编程接口时,您可以使用它。

  • 您可以从任何可以将SQL语句发送到要执行的服务器的程序中使用它,例如mysql客户端程序。

  • 即使客户端使用旧版本的客户端库,您也可以使用它。

准备语句的SQL语法用于以下情况:

  • 要测试在编码之前,在应用程序中如何在应用程序中工作。

  • 在您无权访问支持它们的编程API时,请使用准备的语句。

  • 使用准备好的语句以交互式方式解决应用程序问题。

  • 要创建一个测试用例,可与准备好的语句再现问题,以便您可以提交错误报告。

PREPARE、EXECUTE和DEALLOCATE PREPARE语句

准备好语句的SQL语法基于三个SQL语句:

下面的例子展示了两种等价的方法来准备一个语句,该语句计算给定三角形两边长度的斜边。

第一个例子展示了如何使用字符串字面量来提供语句的文本来创建预处理语句:

MySQL>从'选择SQRT(POW(?,2)+ POW(?,2))作为斜边';mysql>设置@a = 3;mysql>设置@b = 4;MySQL>执行STMT1使用@a,@b;+ ------------ + |斜边|+ ------------ + |5 |+ ------------ + MySQL> Deallocate准备STMT1;

第二个例子是相似的,但将语句的文本提供为用户变量:

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS斜边';mysql>准备stmt2 FROM @s;mysql> SET @a = 6;mysql> SET @b = 8;mysql> EXECUTE stmt2 USING @a, @b;+------------+ | 斜边  | +------------+ | 10  | +------------+ mysql >释放准备stmt2;

下面是另一个示例,演示了如何选择在运行时执行查询的表,方法是将表的名称存储为一个用户变量:

mysql >使用测试;mysql> CREATE TABLE t1 (a INT NOT NULL);mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80)mysql> SET @table = 't1';mysql> SET @s = CONCAT('SELECT * FROM ', @table);mysql>准备stmt3 FROM @s;mysql >执行stmt3;+——+ |  | +----+ | 32 11 8 4 | | | | | | | | 80年  | +----+ mysql >释放准备stmt3;

准备好的语句特定于创建它的会话。如果您终止会话而没有释放之前准备好的语句,服务器将自动释放它。

准备好的声明也是全球性的。如果在存储的例程中创建准备好的语句,则在存储的例程结束时不会释放。

为防止同时创建过多的准备语句,请设置max_prepared_stmt_count系统变量。为防止使用准备的语句,请将值设置为0。

准备语句允许的SQL语法

下面的SQL语句可以作为准备语句使用:

ALTER TABLE改变用户分析表缓存索引调用修改主校验和{表|表}{创建|删除}提交数据库索引{创建|重命名|删除}{创建|删除}表{创建|重命名|删除}用户{创建|删除}视图删除做冲洗{表|表| | | |主机权限日志表与读锁| | | |奴隶大师地位USER_RESOURCES}格兰特插入安装插件杀死指数加载到缓存优化表重命名表修理表取代重置{主|从}撤销选择集展示BINLOG事件显示创建{过程|函数}| | |事件表视图显示{主|二进制}日志显示{主|从}状态奴隶{启动|停止}截断表卸载插件更新

不支持其他语句。

为了符合SQL标准,它指出诊断语句不准备,MySQL不支持以下准备好陈述:

  • 显示警告,显示计数(*)警告

  • 显示错误,显示COUNT(*)错误

  • 陈述包含任何参考的警告_count.或者error_count系统变量。

通常,在存储的程序中也不允许在SQL准备好语句中允许的语句。注意到例外第25.8节“限制存储计划”

检测到由准备语句引用的表或视图的元数据更改,并在下次执行时对语句自动进行自动重置。有关更多信息,请参阅第8.10.3节“准备好的陈述和存储计划缓存”

占位符可以用于争论的论点限制使用准备好的陈述时的子句。看到第13.2.10节,“SELECT语句”

准备好调用与之使用的陈述准备执行,占位符支持进出参数从MySQL 8.0开始可用。看到第13.2.1节“呼叫声明”,有一个例子和早期版本的解决方法。占位符可用于参数无论版本如何。

准备语句的SQL语法不能以嵌套的方式使用。也就是说,传递给准备不能本身是准备,执行,或Deallocate准备陈述。

准备语句的SQL语法不同于使用准备语句API调用。例如,您不能使用mysql_stmt_prepare ()C API函数编写的一个准备,执行,或Deallocate准备陈述。

准备语句的SQL语法可以在存储过程中使用,但不能在存储函数或触发器中使用。但是,游标不能用于用它准备和执行的动态语句准备执行。游标的语句是在创建游标时检查的,因此语句不能是动态的。

准备好语句的SQL语法不支持多语句(即单个字符串中的多个语句;字符)。

类来编写C程序调用SQL语句以执行包含准备好语句的存储过程,client_multi_results.必须启用标志。这是因为调用返回一个结果以指示调用状态,以及过程中执行的语句可能返回的任何结果集。

client_multi_results.可以在您致电时启用mysql_real_connect (),无论是通过传递的明确client_multi_results.旗帜本身,或通过传递隐含地CLIENT_MULTI_STATEMENTS(也可以client_multi_results.)。有关其他信息,请参见第13.2.1节“呼叫声明”