MySQL 预处理语句prepare、execute、deallocate的使用
所以对于中文乱码,需要去check的地方有如下3个:
1、mysql窗口的字符编码(xshell连接的远程工具的字符集设置);
2、数据库的字符编码(show variables like '%char%');
3、linux操作系统的字符编码(echo $LANG);
检查mysql服务器所在的linux os的字符集: cat /etc/sysconfig/i18n
MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT。
我习惯称其为【预处理语句】。
其用法十分简单,
- PREPARE stmt_name FROM preparable_stmt
- EXECUTE stmt_name
- [USING @var_name [, @var_name] ...] -
- {DEALLOCATE | DROP} PREPARE stmt_name
举个栗子:
- mysql> PREPARE pr1 FROM 'SELECT ?+?';
- Query OK, 0 rows affected (0.01 sec)
- Statement prepared
- mysql> SET @a=1, @b=10 ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> EXECUTE pr1 USING @a, @b;
- +------+
- | ?+? |
- +------+
- | 11 |
- +------+
- 1 row in set (0.00 sec)
- mysql> EXECUTE pr1 USING 1, 2; -- 只能使用用户变量传递。
- ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the
- right syntax to use near '1, 2' at line 1
- mysql> DEALLOCATE PREPARE pr1;
- Query OK, 0 rows affected (0.00 sec)
使用PAREPARE STATEMENT可以减少每次执行SQL的语法分析,
比如用于执行带有WHERE条件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改变量值即可。
同样可以防止SQL注入,参数值可以包含转义符和定界符。
适用在应用程序中,或者SQL脚本中均可。
更多用法:
同样PREPARE ... FROM可以直接接用户变量:
- mysql> CREATE TABLE a (a int);
- Query OK, 0 rows affected (0.26 sec)
- mysql> INSERT INTO a SELECT 1;
- Query OK, 1 row affected (0.04 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> INSERT INTO a SELECT 2;
- Query OK, 1 row affected (0.04 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> INSERT INTO a SELECT 3;
- Query OK, 1 row affected (0.04 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> SET @select_test = CONCAT('SELECT * FROM ', @table_name);
- Query OK, 0 rows affected (0.00 sec)
- mysql> SET @table_name = 'a';
- Query OK, 0 rows affected (0.00 sec)
- mysql> PREPARE pr2 FROM @select_test;
- Query OK, 0 rows affected (0.00 sec)
- Statement prepared
- mysql> EXECUTE pr2 ;
- +------+
- | a |
- +------+
- | 1 |
- | 2 |
- | 3 |
- +------+
- 3 rows in set (0.00 sec)
- mysql> DROP PREPARE pr2; -- 此处DROP可以替代DEALLOCATE
- Query OK, 0 rows affected (0.00 sec)
每一次执行完EXECUTE时,养成好习惯,须执行DEALLOCATE PREPARE … 语句,这样可以释放执行中使用的所有数据库资源(如游标)。
不仅如此,如果一个session的预处理语句过多,可能会达到max_prepared_stmt_count的上限值。
预处理语句只能在创建者的会话中可以使用,其他会话是无法使用的。
而且在任意方式(正常或非正常)退出会话时,之前定义好的预处理语句将不复存在。
如果在存储过程中使用,如果不在过程中DEALLOCATE掉,在存储过程结束之后,该预处理语句仍然会有效
MySQL 预处理语句prepare、execute、deallocate的使用的更多相关文章
- Mysql预处理语句prepare、execute、deallocate
前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...
- PHP MySQL 预处理语句
PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...
- mysql之预处理语句prepare、execute、deallocate
预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...
- MySQL预处理语句
预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...
- mysql -- 预处理语句
所谓预处理,即在真正执行某条SQL语句之前,先将SQL语句准备好,在执行过程中再绑定数据 语法: 准备预处理 prepare 预处理名字 from ‘要执行的SQL语句’ 执行预处理 execute ...
- 吴裕雄--天生自然 PHP开发学习:MySQL 预处理语句
<?php $servername = "localhost"; $username = "root"; $password = "admin& ...
- PHP MySQL -处理语句
PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...
- MySQL 游标(PREPARE预处理语句)
概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...
- 理解Mysql prepare预处理语句
MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势.候选界面包括MySQL C API客 ...
随机推荐
- 优美的英文诗歌Beautiful English Poetry
<When you are old>——<当你老了> --- William Butler Yeats ——威廉·巴特勒·叶芝When you are old and grey ...
- INSPIRED启示录 读书笔记 - 第28章 创业型公司的产品管理
产品设计方式 第一步:创业初期只设三个职位,产品经理.交互设计师和原型开发人员(职位可以兼任) 第二步:快速展开产品设计(高保真原型),邀请真实的目标用户验证产品原型,迭代修改 第三步:随着迭代的深入 ...
- 数据库系统概论学习2-《关系数据库与 E/R 模型》
-----------------------------一直更新学习内容------------------------------------ 建立一个关系数据库需要几步? 2.关系数据库与 E/ ...
- android 修改源码framework后如何编译【转】
本文转载自:https://blog.csdn.net/fuchengbo000/article/details/43193801 1.如果在framework/base/core/res/res下添 ...
- 监控pbs运行状况
# 监控内存使用情况 job_id=163997workdir=/share_bio/echo "population_sizes" >> $workdir/pbs/p ...
- 基于Spring mvc 的Websocket 开发
1.Pom.xml <dependency> <groupId>org.springframework</groupId> <artifactId>sp ...
- 考勤助手——基于CS三层结构的子系统设计
因为小组比较倾向于cs分层结构的风格,所以基于对考勤助手最初的体系架构的设计进行了子系统的分层设计,如下图: 1.教务老师安排课程子系统 2.教务老师查询相关信息的子系统 3.任课教师管理考勤子系统 ...
- 泛型学习第一天:List与IList的区别 (一)
先看代码: using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace L ...
- hdoj1002--A + B Problem II
Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...
- linux下如何查看某个软件 是否安装??? 安装路径在哪???
<1>.在linux下如何判断是否已经安装某个软件? 我的系统是red hat 我用命令rpm查是否安装了某个软件(例如: matlab 与 fluent ),得到了如下的结果: 我用rp ...