天天看點

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

[[email protected]_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環境以及配置完成: [email protected]:~$ 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 ...