from用法 prepare_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_nameFROMpreparable_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掉,在存储过程结束之后,该预处理语句仍然会有效

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 MySQL -处理语句

PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...

MySQL 游标(PREPARE预处理语句)

概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...

理解Mysql prepare预处理语句

MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势.候选界面包括MySQL C API客 ...

mysql中SQL执行过程详解与用于预处理语句的SQL语法

mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

随机推荐

JVM 备注

一.堆内存分布: JAVA 分为堆内存和栈内存,GC主要针对堆内存 1)Young: 存放新生内存对象 1.1)Eden JVM 刚开始分配的对象 1.2)Survivor1(from) 1.3)Su ...

ZZULIOJ 1726 迷宫(BFS+小坑)

1726: 迷宫 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 394  Solved: 64 SubmitStatusWeb Board Descr ...

S5PV210之beep-bus模型 linux3.0.8驱动

目录: 一. bus-driver-device模型 二. 运行结果,及错误解决 三. 怎样利用以有的driver device驱动来写自已的beep-driver-device 驱动       四 ...

Ionic 测试针对Andorid平台

环境准备: (1)nodejs环境以及配置完成: y@y:~$ node -v v0.12.2 (2)Android SDK 环境变量已经配置完毕: export ANDROID_SDK=/home/ ...

php 中数据类型

总体划分 8 中 1基本类型(标量) 整型 int 整型的三种写法 <?php $n1 = 123; //10进制 $n2 = 0123; //8进制 $n3 = 0x123;//16进制 // ...

小白学PYTHON时最容易犯的6个错误,看看你遇到过几个

最近又在跟之前的同学一起学习python,一起进步,发现很多测试同学在初学python的时候很容易犯一些错误,特意总结了一下.其实这些错误不仅是在学python时会碰到,在学习其他语言的时候也同样会碰 ...

【BZOJ5469】&lbrack;FJOI2018&rsqb;领导集团问题(动态规划,线段树合并)

[BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...

RDLC 主从报表筛选

今天继续学习RDLC报表的“参数传递”及“主从报表” 一.先创建DataSet,如下图: 二.创建一个报表rptDEPT.rdlc,显示部门T_DPET的数据 三.嵌入Default.aspx中,写在 ...

django之中间件middleware

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的se ...

svn分支

在svn上我们除过一般的保存文档外,对于开发source,可以使用 trunk(主线),branch(分线), tag(上线或测试用) 做分支应用开发. trunk上建立代码位置,存放代码. 点击Te ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值