日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

c语言 mysql_bind,linux C mysql的blob门类字段的插入和读取

發(fā)布時間:2025/4/16 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 mysql_bind,linux C mysql的blob门类字段的插入和读取 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

linux C mysql的blob類型字段的插入和讀取。

RT,沒對mysql中的這種類型操作過,還請各位大神幫幫忙,需要一點代碼,確實有點急,網(wǎng)上看了一些,但是沒怎么看懂。還望指導,多謝!!

mysql

linux

c

------解決方案--------------------

要存取二進制數(shù)據(jù)。我在VB中用libmysql.dll來操作MySQL,應該說比VC來得來更復雜些。本論壇有討論,可惜現(xiàn)在論壇搜索功能不穩(wěn)定,搜索不到。現(xiàn)將收藏的內(nèi)容貼出。另外,我認為可以將二進制數(shù)據(jù)進行BASE64編碼,轉(zhuǎn)成字符串來操作,問題就簡單得多了。

MySQL中的二進制數(shù)據(jù)的存取

今天看了MySQL的文檔,也看了一些網(wǎng)上的文章,了解到了二進制數(shù)據(jù)在MYSQL中是如何處理的,許多例子是用在圖像數(shù)據(jù)

的存取中,偏偏我要存取的不是圖像數(shù)據(jù),不過也沒有關系,反正都是二進制數(shù)據(jù),沒有區(qū)別.

我現(xiàn)在總結(jié)一下在LINUX下如何用C存取二進制數(shù)據(jù).

如果是插入二進制數(shù)據(jù),你能有如下的步驟:

1,定義一個緩沖區(qū)char?buf[EB]??(What?EB??Enought?Big,hehe~~~)

2,把標準的SQL語句用sprintf或strcpy之類的函數(shù)填入,直到插入二進制的地方.在下面一步插入二進制.

3,用某種方法讀取二進制數(shù)據(jù)到tmpbuf[SIZE];

??例如:要插入的是圖像文件數(shù)據(jù),用fread(tmpbuf,?1,?sizeof(tmpbuf),?filestream),然后用

mysql_real_escape_string()函數(shù)將buf繼續(xù)填滿(注意應在第2步中填入的字串的結(jié)束字符'\0'開始填起,即不要

有'\0'),這個函數(shù)的原型為:

unsigned?long?mysql_real_escape_string(MYSQL?*mysql,?char?*to,?const?char?*from,?unsigned?long?length)

其中mysql指針是有效的,已經(jīng)連接成功的句柄,換句話說mysql必須是成功執(zhí)行mysql_real_connect()函數(shù)返回的句柄.

如果你看到了mysql_escape_string這種函數(shù),那請不要使用它,它已經(jīng)快被廢除了.

4,若還有要插入的數(shù)據(jù),繼續(xù)2,3步.

5,然后加上余下的SQL語言構(gòu)成完整的SQL語言.

6,最后你可以用mysql_real_query()來執(zhí)行SQL語言了,其原型如下:

int?mysql_real_query(MYSQL?*mysql,?const?char?*query,?unsigned?long?length)

注意:有一個要點要注意,因為二進制數(shù)據(jù)包括了許多的0或\r等等之類的字符,在字符串中有可能被解釋成其他的意思,所以我們用了上面mysql_real_escape_string()函數(shù)來拷貝數(shù)據(jù),所以我們必須有變量能記錄查詢字串buf[EB]的首尾位置,這樣我們才能知道到底查詢字串有多長,在最后把該長度傳遞給mysql_real_query函數(shù)的最后一個參數(shù).

如果是查詢到二進制的數(shù)據(jù),那也很容易,我就隨便說幾個要點:

1,構(gòu)造查詢字串.

2,執(zhí)行mysql_real_query查詢.

3,用mysql_store_result存儲結(jié)果.

4,用mysql_fetch_row取出一條記錄處理.

如果取出來的是二進制的數(shù)據(jù),要確定它的長度,必須要用mysql_fetch_lengths函數(shù)取得其長度.

mysql數(shù)據(jù)庫如何存儲二進制數(shù)據(jù)?linux下?C?API

用?mysql_stmt_send_long_data()來做

這里是mysql文檔的例子,它存儲的是text類型。blob類型類似

二進制文件讀取,可見

http://www.chinaunix.net/jh/23/312541.html

#define?INSERT_QUERY?"INSERT?INTO?test_long_data(text_column)?VALUES(?)"

MYSQL_BIND?bind[1];

long????length;

smtt?=?mysql_stmt_init(mysql);

if?(!stmt)

{

fprintf(stderr,?"?mysql_stmt_init(),?out?of?memory\n");

exit(0);

}

if?(mysql_stmt_prepare(stmt,?INSERT_QUERY,?strlen(INSERT_QUERY)))

{

fprintf(stderr,?"\n?mysql_stmt_prepare(),?INSERT?failed");

fprintf(stderr,?"\n?%s",?mysql_stmt_error(stmt));

exit(0);

}

memset(bind,?0,?sizeof(bind));

bind[0].buffer_type=?MYSQL_TYPE_STRING;

bind[0].length=?&

bind[0].is_null=?0;

/*?Bind?the?buffers?*/

if?(mysql_stmt_bind_param(stmt,?bind))

{

fprintf(stderr,?"\n?param?bind?failed");

fprintf(stderr,?"\n?%s",?mysql_stmt_error(stmt));

exit(0);

}

/*?Supply?data?in?chunks?to?server?*/

if?(!mysql_stmt_send_long_data(stmt,0,"MySQL",5))

{

fprintf(stderr,?"\n?send_long_data?failed");

fprintf(stderr,?"\n?%s",?mysql_stmt_error(stmt));

exit(0);

}

/*?Supply?the?next?piece?of?data?*/

if?(mysql_stmt_send_long_data(stmt,0,"?-?The?most?popular?open?source?database",40))

總結(jié)

以上是生活随笔為你收集整理的c语言 mysql_bind,linux C mysql的blob门类字段的插入和读取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。