1、
mysql預處理簡介
預處理的意思是先提交sql語句到mysql服務端,執行預編譯,客戶端執行sql語句時,只需上傳輸入引數即可,這點和儲存過程有點相似。
一般而言,預處理的執行效率相對於一般的sql執行操作,效率比較高。由於客戶端上傳的或是讀取的結果集是繫結輸入記憶體位址和輸出記憶體位址,對於一些二進位製流,或大資料量的儲存和讀取顯得尤為方便。
2、參考說明
具體的可以參考mysql的操作手冊,裡面第25章,c api庫,裡面有詳細的說明。鏈結位址如下:
3、以乙個簡單的sql查詢語句來簡要說明一下mysql預處理的功能。
呼叫mysql c api的預處理函式,執行預處理功能的步驟一般如下:
1)先呼叫mysql_init(),初始化乙個mysql物件,用於與資料庫的鏈結控制代碼 2)
呼叫mysql_real_connect()鏈結資料庫服務端 3)
呼叫mysql_stmt_init()初始化乙個mysql_stmt物件,用於處理對應的預處理操作 4)
呼叫mysql_stmt_prepare()介面,上傳預處理的sql語句 5)
定義相應的mysql_bind資料結構,呼叫mysql_stmt_bind_param用於繫結輸入引數 6)
如果有輸出結果集,可以選擇呼叫mysql_stmt_result_metadata()介面以結果集mysql_res形式返回預處理語句元資料。 7)
呼叫mysql_stmt_execute()執行相應的sql查詢操作 8)
如果有輸出結果,呼叫mysql_stmt_bind_result將輸出結果繫結到mysql_bind資料結構物件上,同時呼叫mysql_stmt_store_result()將所有的結果集儲存到客戶端的緩衝區中,並通過mysql_stmt_fetch()來進行呼叫獲取返回的每行的值
//初始化資料和鏈結控制代碼
mysql* psql = new mysql;
mysql_init(psql);
mysql_stmt* psql_stmt = mysql_stmt_int(psql);
//鏈結資料庫
mysql_read_connect(psql, 「127.0.0.1」, 「root」, 「123456」, 「stmt」, null, 0);
//預處理的sql語句,後面的』?』表示輸入引數
cstring strsql = 「select name, photodata from photodata where id = ? 「;
//準備字串查詢指向的sql語句
mysql_stmt_prepare(psql_stmt, strsql.getbuffer(0), strsql.getlength());
//宣告輸入引數的繫結資料結構
mysql_bind v_pparabind[1]; //只有乙個輸入引數,繫結乙個即可
my_bool v_pparaisnull[1]; //用於標明是輸入還是輸出
unsigned long paralength[1]; //用於儲存輸入引數長度或輸出結果長度
memset(v_pparabind, 0, sizeof(v_pparabind));
memset(v_pparaisnull, 0, sizeof(v_pparaisnull));
memset(paralength, 0, sizeof(paralength));
int nid = 18; //假定前面的那個select語句的輸入引數為18
v_pparabind [0].buffer = (char*)& nid;
v_pparabind [0].buffer_length = sizeof(int);
paralength[0] = sizeof(int);
v_pparabind [0].length = &(paralength[0]);
v_pparabind [0].is_null = &( v_pparaisnull [0]);
v_pparabind [0].buffer_type = mysql_type_long; //標明輸入的型別是int型
//繫結輸入引數值
mysql_stmt_bind_param(psql_stmt, v_pparabind);
//執行sql查詢操作
mysql_stmt_execute(psql_stmt);
//繫結輸出結果的mysql_bind結構
mysql_bind v_presultbind[2]; //輸出結果有兩個資料列,定義兩個bind分別對應
my_bool v_presultisnull[2];
unsigned long resultlength[2];
char szname[200] = ;
char szphotodata[2000] = ;
memset(v_presultbind, 0, sizeof(v_presultbind));
memset(v_presultisnull, 0, sizeof(v_presultisnull));
memset(resultlength, 0, sizeof(resultlength));
v_presultbind[0].buffer = szname; //用於儲存返回的結果資料
v_presultbind[0].length = &(resultlength[0]); //用於儲存返回結果長度
v_presultbind[0].is_null = &(v_presultisnull[0]);
v_presultbind[0].buffer_type = mysql_type_string;
v_presultbind[1].buffer = szphotodata;
v_presultbind[1].length = &(resultlength[1]);
v_presultbind[1].is_null = &(v_presultisnull[1]);
v_presultbind[1].buffer_type = mysql_type_blob;
mysql_stmt_bind_result(psql_stmt, v_presultbind);
//獲取每行的值
mysql_stmt_store_result(psql_stmt);
while(!mysql_stmt_fetch(psql_stmt))
if(!v_presultisnull[1])
} //釋放mysql_stmt和mysql物件
mysql_stmt_close(psql_stmt);
psql_stmt = null;
mysql_close(psql);
psql = null;
4、
mysql_stmt_send_long_data()函式
改函式用於將比較長的引數分幾塊依次傳輸給服務端,用法和上例一樣,只是在繫結mysql_bind引數值時,呼叫mysql_stmt_send_long_data(),傳入bind指向的引數每一塊指標和長度,具體可見:
資料清洗之資料預處理 學習筆記
電單車的銷售情況資料 import numpy as np import pandas as pd import os os.chdir r f csdn 課程內容 和資料 df pd.read csv motorcycledata.csv encoding gbk na values na 1.重...
mysql預處理語句 MYSQL 預處理語句
一 預處理語句介紹 mysql支援服務端預處理語句,預處理語句利用高效的客戶端 服務端二進位制協議。用佔位符替換引數值的預處理語句有下列兩個好處 每次執行語句時,解析語句的開銷更小。通常,資料庫應用程式會處理大量相似的語句,只在子句中更改文字或變數值,比如查詢和刪除的where子句,更新的updat...
mysql 預處理 MySQL的預處理技術
所謂的預處理技術,最初也是由mysql提出的一種減輕伺服器壓力的一種技術!傳統mysql處理流程 1,在客戶端準備sql語句 2,傳送sql語句到mysql伺服器 3,在mysql伺服器執行該sql語句 4,伺服器將執行結果返回給客戶端 這樣每條sql語句請求一次,mysql伺服器就要接收並處理一次...