日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

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

mysql

linux

c

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

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

MySQL中的二進制數據的存取

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

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

我現在總結一下在LINUX下如何用C存取二進制數據.

如果是插入二進制數據,你能有如下的步驟:

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

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

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

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

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

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

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

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

如果你看到了mysql_escape_string這種函數,那請不要使用它,它已經快被廢除了.

4,若還有要插入的數據,繼續2,3步.

5,然后加上余下的SQL語言構成完整的SQL語言.

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

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

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

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

1,構造查詢字串.

2,執行mysql_real_query查詢.

3,用mysql_store_result存儲結果.

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

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

mysql數據庫如何存儲二進制數據?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))

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。