mysql Prepared Statements
http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html
一:介绍
从 5.1开始,mysql支持服务器端的Prepared Statements,他使用在client/server更有优势的binary protocol,(mysql的传统的协议中,再把数据通过网络传输前,需要把一切数据都转换成strings,这样就比原始数据大很多,最后,在服务器端,还必须把string转化成正确的数据格式。而binary protocol去除了转换的开销,在被传输前,所有类型都转换成本地的binary类型,这样就减少了cpu转换的开销跟网络的使用)在C API/php API中都能支持使用 Prepared Statements,而在交互式的sql接口中也支持,但是他不能使用binary protocol,所以他一般只用在测试或者本地不支持api的情况下。
Prepared Statements的sql语法是基于三个sql 语法
1:PREPARE prepares a statement for execution
2:EXECUTE executes a prepared statement
3:DEALLOCATE PREPARE releases a prepared statement
下面使用使用prepared statement两种的方法来计算直角三角行的斜边
1:使用字符串声明来创建prepared statement
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;
2:跟上面一样,但是使用用户变量来声明
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;
下面的例子是演示:当表名是通过用户变量存储时,如何选择表名来运行query。
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;
二:为什么要使用 Prepared Statements
在应用程序中,使用Prepared Statements有很多好点,包括安全跟性能原因
1:安全
Prepared Statements通过sql逻辑与数据的分离来增加安全,sql逻辑与数据的分离能防止普通类型的sql注入攻击(SQL injection attack),在一些特殊的query中,提交从客户端那接受来的数据时,应该很注意,在使用麻烦字符(如:single quote, double quote, and backslash characters)时这注意是很有必要的。在这里,Prepared Statements使用不是很有必要,但数据的分离允许MySQL的自动考虑到这些字符,使他们并不需使用任何特殊功能来要转义
2:性能
第一:Prepared Statements只语法分析一次,你初始话Prepared Statements时,mysql将检查语法并准备语句的运行,当你执行query 多次时,这样就不会在有额外的负担了,如果,当运行query 很多次的时候(如:insert)这种预处理有很大的性能提高。
第二:就是上面说的他使用binary protocol协议,这样更能提高效率。
但是我使用Prepared Statements,并不是因为上面两个原因,我是因为在存储过程中,有的语句语法并不能使用动态的变量,(如:select的limit,alter 语句)就只有用 Prepared Statements来解决这个问题了。如:
set @stmt=concat('alter table weekstock add week',@weekname,' int(4)');
prepare s1 from @stmt;
execute s1;
deallocate prepare s1;
三:注意:
如果prepared statement在session级别被新建时,如果你关闭session,就会自动deallocates。在session中也能使用全局的prepared statement,如果你在这存储过程中使用新建prepared statement,当存储过程结束时候,他是不会自动deallocates 故为了限制在瞬间新建大量的prepared statements,mysql通过max_prepared_stmt_count 变量来控制,当设为0时,是限制使用prepared statements.
下面语法能被使用在 prepared statements中: ALTER TABLE, CALL, COMMIT, CREATE INDEX, CREATE TABLE, DELETE, DO, DROP INDEX, DROP TABLE, INSERT, RENAME TABLE, REPLACE, SELECT, SET, UPDATE, and most SHOW statements.例外有的statements 会在后续版本中添加进来。
转自:http://blog.csdn.net/yq495/article/details/8250352
mysql Prepared Statements相关推荐
- mysql prepare原理,mysql Prepared Statements 原理介绍与优点 | 学步园
一:介绍从 5.1开始,mysql支持服务器端的Prepared Statements,他使用在client/server更有优势的binary protocol,(mysql的传统的协议中,再把数据 ...
- 预编译语句(Prepared Statements)介绍,以MySQL为例
1. 背景 本文重点讲述MySQL中的预编译语句并从MySQL的Connector/J源码出发讲述其在Java语言中相关使用. 注意:文中的描述与结论基于MySQL 5.7.16以及Connect/J ...
- c mysql prepared,Mysql 预处理 PREPARE以及预处理的好处
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> SET @a = 3; mysql> ...
- prepared statement mysql_MySQL数据库之MySQL Prepared Statement
本文主要向大家介绍了MySQL数据库之MySQL Prepared Statement ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. Summary: in this tuto ...
- Prepared Statements 如何大幅度提高性能
本文讲述了如何正确的使用prepared statements.为什么它可以让你的应用程序运行的更快,和同样的让数据库操作变的更快. 为什么Prepared Statements非常重要?如何 ...
- mysql prestatement_MySQL之Prepared Statements
1.概述 prepared statement在MySQL4.1中引进并且增加了一些新的命令: COM_STMT_PREPARE COM_STMT_EXECUTE COM_STMT_CLOSE COM ...
- iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
在前面的博客中已经介绍了如何连接SQLite数据库,并且简单的查询和遍历结果集.在前面用到了sqlite3_stmt *stmt,也就是预编译后的SQL语句.在本篇博客中会了解一下sqlite3_st ...
- Prepared statements(mysqli pdo)
参考: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php http://www.ultramegatech.com/ ...
- mysql pdo 读取字段名_PDO如何处理SQL语句中对字段名以及表名的转义
比如在一个数据表中有一个字段叫order,是专门用来做排序的,我的语句可能要这么写$sth = $pdo->prepare('SELECT * FROM table_name ORDER BY ...
最新文章
- [bat批处理文件] 压缩备份
- 原码、反码、补码解析,保证一次搞懂
- Struts学习之手动验证
- python模拟购物车购物过程_Python基于数列实现购物车程序过程详解
- 应用数学软件测试题,高等数学第六章定积分应用综合测试题
- markdown如何设置图片大小_不会吧,还不会用markdown排版吗
- Select控件实现联动下拉列表框效果
- 【大数据-第二期】java基础第五天作业
- dup和dup2详解
- C#高级编程9 第18章 部署
- 管理感悟:忙的真正含义是没心思
- 值得收藏!深度报告解读NB-IoT
- ios 改变图片尺寸_iOS 修改图片尺寸的方法
- 【数学】求一类数列的通项公式
- 代码读智识 笔墨知人心 1
- iOS Workspace内多project开发
- 博客内容导航——你想要的我都有!
- DQN、DDQN、Dueling DQN、PER DQN
- element-UI中使用树组件el-tree实现左侧勾选右侧列表展示并且列表删除某一项左侧树菜单取消相应勾选
- 自定义控件从入门到轻生之---来个结晶