C語言寫二進位制資料到mysql的Blob欄位

2021-08-15 10:57:27 字數 3355 閱讀 7949

-- 引子--

由於除錯需要,需直接往資料庫裡寫入二進位制資料。本來這些資料是由上層軟體來寫的,用的是c#。為了熟悉c語言的資料庫操作,還是決定用c來寫這段除錯**。

概況:表名:task

涉及的字段及屬性:

numdest:int(11)  用於儲存目標數目

destids:   blob        用於儲存具體的目標id

廢話不多說,入正題。

--二進位制資料寫入--

二進位制資料最為常見的就是等一些檔案資訊。雖然我這裡不是這型別資訊,但確實是二進位制資料。

具體步驟:

1、定義乙個buffer(如陣列)來儲存sql語句

2、把涉及到二進位制資料之前的sql語句新增到buffer中,可用sprintf或strcpy等。

3、用mysql_real_escape_string()函式新增二進位制資料到buffer中。

4、加上剩餘的sql語句,形成完整的sql語句。

5、利用mysql_real_query()函式來執行sql語句。

具體**如下:

#

include

#include

#include

#include

#include

<

string

.h>

int main(

int argc,

char

*argv)

index =

atoi

(argv[1]);

printf

("index: %d\n"

, index)

;destids =

(uint32_t*)

malloc

(index *

sizeof

(uint32_t))

;if(destids =

=null

)printf

("malloc error\n");

for(i=0; idestids[i]

= i + 1;

mysql_init(

&mysql);if

(!(mysql_real_connect(

&mysql,

"localhost"

,"root"

,"654321"

,"dbname"

, 0,

null

, 0)))

sprintf

(sql,

"insert into task(numdest, destids) value (%u, "

, index )

;end = sql +

strlen

(sql)

;*end++=

'\''

;end +

= mysql_real_escape_string(

&mysql, end,

(char

*)destids, index*

sizeof

(uint32_t))

;*end++=

'\''

;*end++=

')';

printf

("end - sql: %d\n",(

unsigned

int)

(end - sql));

if(mysql_real_query(

&mysql, sql,

(unsigned

int)

(end - sql)))

mysql_close(

&mysql)

;exit

(0);

#endif

return 0;

}

--讀取二進位制檔案--

對於二進位制檔案的讀取,也類似。

具體步驟:

1,構造查詢字串.

2,執行mysql _query查詢. (網上有說用mysql_real_query,未實驗)

3,用mysql_store_result儲存結果.

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

具體**如下:

#

include

#include

#include

#include

#include

<

string

.h>

int main(

void

)sprintf

(sql,

"select taskid, numdest, destids from task");

ret = mysql_query(

&mysql, sql);if

(ret !

= 0)

result = mysql_store_result(

&mysql);if

(result =

=null)if

((row = mysql_fetch_row(result))!

=null

)memcpy

(destids, row[2]

, destnum *

sizeof

(uint32_t))

;}mysql_free_result(result)

;printf

("destnum: %d\n"

, destnum)

;temp = destids;

for(i=0; ireturn ret;

}

由於我這裡可以根據numdest獲取到二進位制的長度,所以不用再用函式去獲取。

據網上資訊,獲取二進位制首席資訊官度應該這樣:「如果取出來的是二進位制的資料,要確定它的長度,必須要用mysql_fetch_lengths函式取得其長度」

int num_fields = mysql_num_fields(result)

;unsigned

long

*lengths = mysql_fetch_lengths(result)

;for

(i=0; iprintf

("column: %u\t %lu bytes\n"

, i+1, lengths[i]);

destids =

(uint32_t*)

malloc

(lengths[2]);

if(destids =

=null

)memcpy

(destids, row[2]

, lengths[2]);

c 二進位制 負數 二進位制概念

我們平時認識的數字比如1 2 3 4等數字叫做十進位制數字,我們可以看懂,但是計算機無法運算,如果計算機要計算這些數字就得將這些數字轉換成計算機能讀懂的資料,計算只能讀懂二進位制數字,二進位制的數字有什麼特徵呢?二進位制就是由1和0組成的數字,那麼為什麼計算機要使用二進位制資料呢?下面作為了解。a ...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

C 二進位制檔案寫操作

include fstream.h main for inti 0 i 9 i ofstream rs ok2002com.bin ios binary 開啟二進位制檔案ok2002com.bin 注意 開啟二進位制檔案時,訪問模式設定為 ios binary for i 0 i 9 i rs.cl...