mysql C API blob(ZZ)

原文 http://hi.baidu.com/qiek/blog/item/a8cefd3818facbf43b87ce45.html

 

Mysql C API寫入BLOB類型數據
2009-02-21 下午 03:30

要 存取二進制數據。我在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))
{
   fprintf(stderr, "/n send_long_data failed" ;
   fprintf(stderr, "/n %s", mysql_stmt_error(stmt));
   exit(0);
}

/* Now, execute the query */
if (mysql_stmt_execute(stmt))
{
   fprintf(stderr, "/n mysql_stmt_execute failed" ;
   fprintf(stderr, "/n %s", mysql_stmt_error(stmt));
   exit(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章