MySQL 8.0支持服务器端预处理语句。这种支持利用了有效的客户端/服务器二进制协议。对参数值使用带占位符的预处理语句具有以下好处:每次执行语句时解析语句的开销都较小。通常,数据库应用程序处理大量几乎相同的语句,仅对子句中的文字或变量值进行更改,例如WHERE查询和删除,SET更新和VALUES插入。

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

应用程序中的预处理的语句

您可以通过客户端编程接口使用服务器端预处理的语句,包括用于C程序的MySQL C API客户端库,用于Java程序的MySQL Connector / J和用于使用.NET技术的程序的MySQL Connector / NET。例如,C API提供了一组函数调用,这些函数构成了其预处理的语句API。请参见“ C API预处理语句”。其他语言接口可以通过在C客户端库中进行链接来为使用二进制协议的预处理的语句提供支持,其中一个示例就是mysqli extension,在PHP 5.0及更高版本中可用。

SQL脚本中的预备语句

提供了预处理的语句的替代SQL接口。此接口的效率不如通过预预处理的语句API使用二进制协议有效,但不需要编程,因为它可以直接在SQL级别使用:如果没有可用的编程接口,则可以使用它。

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

即使客户端使用旧版本的客户端库,也可以使用它,只要您连接到运行MySQL 4.1或更高版本的服务器即可。

预处理语句的SQL语法旨在用于以下情况:在对预备语句进行编码之前,先对其进行测试。

在无权访问支持它们的编程API时使用预处理的语句。

使用预处理的语句以交互方式解决应用程序问题。

创建一个测试案例,该测试案例用预处理的语句重现问题,以便您可以提交错误报告。

PREPARE,EXECUTE和DEALLOCATE PREPARE语句

预预处理语句的SQL语法基于以下三个SQL语句:PREPARE预处理要执行的语句(请参见“ PREPARE语句”)。

EXECUTE执行一个预处理的语句(请参见“ EXECUTE语句”)。

DEALLOCATE PREPARE释放预处理的语句(请参见“ DEALLOCATE PREPARE语句”)。

以下示例显示了两种等效的预处理语句的方法,该语句在给定两侧的长度的情况下计算三角形的斜边。

第一个示例显示了如何通过使用字符串文字来提供语句文本来创建预处理的语句:mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

mysql> SET @a = 3;

mysql> SET @b = 4;

mysql> EXECUTE stmt1 USING @a, @b;

+------------+

| hypotenuse |

+------------+

| 5 |

+------------+

mysql> DEALLOCATE PREPARE stmt1;

第二个示例类似,但是将语句的文本作为用户变量提供:mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

mysql> PREPARE stmt2 FROM @s;

mysql> SET @a = 6;

mysql> SET @b = 8;

mysql> EXECUTE stmt2 USING @a, @b;

+------------+

| hypotenuse |

+------------+

| 10 |

+------------+

mysql> DEALLOCATE PREPARE stmt2;

这是另一个示例,该示例通过将表的名称存储为用户变量来演示如何选择要在运行时在其上执行查询的表:mysql> USE test;

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> PREPARE stmt3 FROM @s;

mysql> EXECUTE stmt3;

+----+

| a |

+----+

| 4 |

| 8 |

| 11 |

| 32 |

| 80 |

+----+

mysql> DEALLOCATE PREPARE stmt3;

预处理的语句特定于创建它的会话。如果在不取消分配先前预处理的语句的情况下终止了会话,则服务器会自动取消分配它。

预处理的声明对会话也是全局的。如果在存储的例程中创建一个预处理的语句,则在存储的例程结束时不会释放该语句。

为了防止同时创建太多预处理的语句,请设置max_prepared_stmt_count系统变量。为了防止使用预处理的语句,请将其值设置为0。

预备语句中允许使用的SQL语法

以下SQL语句可以用作预处理的语句:ALTER TABLE

ALTER USER

ANALYZE TABLE

CACHE INDEX

CALL

CHANGE MASTER

CHECKSUM {TABLE | TABLES}

COMMIT

{CREATE | DROP} INDEX

{CREATE | RENAME | DROP} DATABASE

{CREATE | DROP} TABLE

{CREATE | RENAME | DROP} USER

{CREATE | DROP} VIEW

DELETE

DO

FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES

| LOGS | STATUS | MASTER | SLAVE | USER_RESOURCES}

GRANT

INSERT

INSTALL PLUGIN

KILL

LOAD INDEX INTO CACHE

OPTIMIZE TABLE

RENAME TABLE

REPAIR TABLE

REPLACE

RESET {MASTER | SLAVE}

REVOKE

SELECT

SET

SHOW {WARNINGS | ERRORS}

SHOW BINLOG EVENTS

SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}

SHOW {MASTER | BINARY} LOGS

SHOW {MASTER | SLAVE} STATUS

SLAVE {START | STOP}

TRUNCATE TABLE

UNINSTALL PLUGIN

UPDATE

为了符合SQL标准,该标准指出诊断语句不可预处理,MySQL不支持以下作为预处理的语句:SHOW WARNINGS,SHOW COUNT(*)WARNINGS

SHOW ERRORS,SHOW COUNT(*)ERRORS

包含对warning_count或error_count系统变量的任何引用的语句。

MySQL 8.0不支持其他语句。

通常,在存储程序中也不允许使用SQL预预处理语句中不允许的语句。“对存储程序的限制”中指出了异常。

检测到由预处理的语句引用的表或视图的元数据更改,并在下一次执行该语句时导致该语句的自动重新预处理。有关更多信息,请参见“缓存预处理的语句和存储的程序”。

LIMIT使用预处理的语句时,可以将占位符用作子句的参数。请参见“ SELECT语句”。

在CALL与PREPARE和一起使用的预处理的语句中EXECUTE,从MySQL 8.0开始提供对OUT和INOUT参数的占位符支持。有关早期版本的示例和解决方法,请参见“ CALL语句”。IN不论版本如何,都可以将占位符用于参数。

预预处理语句的SQL语法不能以嵌套方式使用。也就是说,声明传递给PREPARE自身不能是一个PREPARE,EXECUTE或者DEALLOCATE PREPARE声明。

预处理语句的SQL语法与使用预处理语句API调用不同。例如,您不能使用mysql_stmt_prepare()C API函数来预处理PREPARE,EXECUTE或DEALLOCATE PREPARE声明。

预处理语句的SQL语法可以在存储过程中使用,但不能在存储函数或触发器中使用。然而,光标不能用于被制备并用执行的动态语句PREPARE和EXECUTE。在创建游标时会检查游标的语句,因此该语句不能是动态的。

预预处理语句的SQL语法不支持多语句(即,单个字符串中的多个语句用字符分隔;)。

要编写使用CALL SQL语句执行包含预处理的语句的存储过程的C程序,CLIENT_MULTI_RESULTS必须启用该标志。这是因为CALL,除了在过程中执行的语句可能返回的任何结果集之外,每个返回的结果还指示调用状态。

CLIENT_MULTI_RESULTS可以在您调用时启用mysql_real_connect(),可以通过传递CLIENT_MULTI_RESULTS标志本身来显式地传递CLIENT_MULTI_STATEMENTS,也可以通过传递来隐式传递(这也启用CLIENT_MULTI_RESULTS)。有关更多信息,请参见“ CALL语句”。

mysql 预处理语句_预处理语句相关推荐

  1. MySQL删除空值语句_数据库语句sql 删除空记录

    最简单删除SQL Server中所有数据的方法 原文:最简单删除SQL Server中所有数据的方法 最简单删除SQL Server中所有数据的方法   编写人:CC阿爸   2014-3-14 其实 ...

  2. mysql50条必看语句_关于语句大全的10篇文章推荐

    下面小编就为大家带来一篇mysql的sql语句特殊处理语句总结(必看).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧1.更新整张表,如果某一行数据的某一列的值为空,那么 ...

  3. python异常处理操作语句_异常处理语句(2)

    1. try...except语句的嵌套 这种语句就是多except语句的多处理方式,下面我们通过一个例题来学习一下try...except的语句嵌套.def test(): n = int(inpu ...

  4. python编程循环语句_循环语句—Python编程从入门到精通(5)

    第6章.循环语句 在本书上一章的内容中,我们学习了实现条件判断功能的条件语句,让程序的执行顺序发生了变化.为了满足循环和跳转等功能,本章将详细讲解Python语言中循环语句的知识,主要包括for循环语 ...

  5. Java位语句_卫语句 - 宿小帅的个人空间 - OSCHINA - 中文开源技术交流社区

    1.使用卫语句取代嵌套表达式 函数中的条件逻辑使人难以看清正常的执行途径.使用卫语句表现所有特殊情况. 动机:条件表达式通常有2种表现形式.第一:所有分支都属于正常行为.第二:条件表达式提供的答案中只 ...

  6. java 预处理语句_预处理语句PreparedStatement到底咋用啊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我自己试了一下直接查询id为1的语句,有一条结果出来,但是用了PreparedStatement后就没有结果了,有大佬知道为什么吗orz package ...

  7. for循环递减_判断语句_循环语句

    创建时间:20200418 修改时间:20200629 1. if 判断语句 1.1 if...elif...else...语句格式 Python 中 if 语句的一般形式如下所示: if 如果 &q ...

  8. mysql预处理语句_MYSQL 预处理语句

    一.预处理语句介绍 MySQL支持服务端预处理语句,预处理语句利用高效的客户端/服务端二进制协议.用占位符替换参数值的预处理语句有下列两个好处: 每次执行语句时,解析语句的开销更小.通常,数据库应用程 ...

  9. mysql set语句_从强网杯随便注浅析mysql存储过程

    从强网杯随便注浅析mysql存储过程 Author: Smity 去年的强网杯,出了一道mysql堆叠注入叫随便注,这道题被好多比赛玩了一整年,直到现在还是有各种新姿势,但是今天我忽然想到似乎没有对这 ...

最新文章

  1. C6678-SRIO和FPGA的通信
  2. Grafana 6.1.3 发布,系统指标监控与分析平台
  3. 用友华表cell的程序发布
  4. 【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )
  5. 使用pip install出现超时警告的解决方法
  6. [蓝桥杯2019初赛]迷宫-bfs+存储路径
  7. um是代表什么意思_白玫瑰代表什么意思 居然有这么多含义
  8. Java基础教程之Java的变量
  9. Fetion2008 分析 Part1:准备工作
  10. 关于IIS不能浏览ASP网页 和不能浏览后台(转)
  11. Linux下source命令作用
  12. Swift仿写有妖气漫画
  13. php电影模板下载,【PHP源码】团啊VIP电影系统V3.7.6源码下载 带自动采集+手机版模板...
  14. Transformer最新综述
  15. VASP四大输入文件——KPOINTS
  16. 4本图神经网络中文书籍的比较
  17. 计算机毕业设计 志愿者服务管理系统 志愿者系统 志愿者招募系统 志愿者报名管理系统 志愿者信息管理系统 志愿者管理系统 志愿者管理系统源码 志愿者管理系统java 志愿者信息管理系统
  18. P3456 [POI2007]GRZ-Ridges and Valleys(bfs)
  19. 微信小程序iOS系统上echarts不能滑动的问题
  20. 密码学常见困难问题DLP,CDH,DDH,GDH,BDH,CBDH,DBDH,GBDH,更新中

热门文章

  1. 技术分享:Ettercap图片分析
  2. 因为知道自己不管做什么,哪怕是最微小、最隐秘的行为也有后果,将影响到自己和他人,所以我们会自然而然的生起责任感,不再只顾眼前,为所欲为。我们也更深切的体会到人与人、人与世界的相互影响、相互依存
  3. USACO2010牛友
  4. 变电所的常见故障和解决方案
  5. STM32F103xx / STM32F429VET6最小系统原理图
  6. 线性和非线性最优化理论、方法及应用研究的发展状况.
  7. 计算机班级学情分析报告,班级学习情况中期总结
  8. PhysX3.4文档(8) -- Advanced Collision Detection
  9. HDU2066一个人的旅行(SPFA)
  10. windows10下安装refind