C MySQL儲存二進位制資料

2021-07-11 18:47:52 字數 3581 閱讀 8519

0x01

首先mysql支援二進位制的型別有blob:

mysql的四種blob型別

型別 大小(單位:位元組)

tinyblob 最大 255

blob 最大 65k

mediumblob 最大 16m

longblob 最大 4g

0x02

插入二進位制資料時需要利用mysql_real_escape_string函式對資料進行轉換

0x03

讀取二進位制資料時需要利用mysql_fetch_length函式字段長度,該函式需要在mysql_fetch_row呼叫後才可以正常獲取結果

0x04

寫入例子:

int  cfinger_printdlg::connect_mysql(byte b_name, byte* b_data,int len_of_data) ;

unsigned int port = 3306;

bool return_result = false;

mysql mycont;

mysql_res *result;

mysql_row sql_row;

hwnd hwnd = getsafehwnd();

tchar sql_buf_t[100] = {};

//clistctrl* list = (clistctrl*)getdlgitem(idc_list3);

mysql_init(&mycont);

if (mysql_real_connect(&mycont, host, user, pswd, db, port, null, 0))

mysql_query(&mycont, "set names gbk"); //設定編碼格式

char buf[2000] = ;

unsigned int escape_size = 2 * len_of_data + 2;

char* escape_object = (char *)malloc(escape_size);

escape_size = mysql_real_escape_string(&mycont, (char*)escape_object, (char *)b_data, len_of_data);

int sql_len = sprintf_s(buf, "insert into finger3(info) values('%s')", escape_object);

res = mysql_real_query(&mycont,buf, sql_len);

if (!res) }

else

mysql_close(&mycont);

return return_result;

}

0x05

讀取操作:

void* cfinger_printdlg::read_mysql()

mysql_res *res = null;

mysql_row row;

unsigned long *row_len;

char *object = null;

//const char *sql = "select info from final where id=";

char sql[100] = ;

unsigned long objsize;

int ret;

for (int i = 1; i <= 10; i++)

res = mysql_store_result(&mycont);

if (res == null)

/* important */

row = mysql_fetch_row(res);

row_len = mysql_fetch_lengths(res); /* get the object's length */

if (row_len == null)

objsize = row_len[0];

object = (char*)malloc(objsize);

if (object == null)

memcpy(object, row[0], objsize);

if (biokey_db_add(zkfingerhandle, i, objsize, (byte*)object)) }

g_connect = false;

; //mysql_close(&mycont);

mysql_free_result(res);

return null;

}

0x06

更新操作:

int cfinger_printdlg::updata_mysql(byte b_name, byte* b_data, int len_of_data)

int res;

bool return_result = false;

mysql_query(&mycont, "set names gbk"); //設定編碼格式

char buf[2000] = ;

unsigned int escape_size = 2 * len_of_data + 2;

char* escape_object = (char *)malloc(escape_size);

escape_size = mysql_real_escape_string(&mycont, (char*)escape_object, (char *)b_data, len_of_data);

cstring id_cs;

cstring name_cs;

int id;

char name[20] = ;

getdlgitem(idc_edit1)->getwindowtextw(id_cs);

getdlgitem(idc_edit2)->getwindowtextw(name_cs);

id = _wtoi(id_cs);

widechartomultibyte(cp_acp, 0, name_cs, -1, name, name_cs.getlength(), null, null);

//int sql_len = sprintf_s(buf, "insert into final(id,name,info) values('%d','%s','%s')", id, name, escape_object);

//update 表名稱 set 列名稱 = 新值 where 列名稱 = 某值

int sql_len = sprintf_s(buf, "update final set name='%s',info='%s' where id ='%d'", name, escape_object, id);

res = mysql_real_query(&mycont, buf, sql_len);

if (!res) }

else

//mysql_close(&mycont);

g_connect = false;

return return_result;

}

c mysql二進位制訪問,blob訪問

取二進位制資料 一樣的sql語句,查詢出來即可。只不過二進位制資料是個資料塊,需要得到資料塊的大小和資料指標。bool cmysqlaccess getbinaryfield int ncol,char pdataout,int ndatalen else 像通常一樣查詢後,得到結果集,然後得到第n...

MySQL儲存二進位制資料

晚上小研究了下mysql儲存於讀取二進位制資料的功能。關鍵步驟為以下三點 最重要的一點 儲存二進位制資料的表的型別需要是blob型別 按長度不同分為tiny,media,long 插入二進位制資料時需要利用mysql real escape string函式對資料進行轉換 從資料庫中讀取二進位制資料...

mongodb儲存二進位制資料

mongodb 3.x儲存二進位制資料並不是以base64的方式,雖然在mongo客戶端的查詢結果以base64方式顯示,請放心使用。下面來分析儲存檔案的儲存內容。base64編碼資料會增長1 3成為顧慮。首先看mongo的c driver對binary型別資料的相關定義。注意下面提到了js,要清楚...