亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux C語言操作MySQL

系統 3013 0
原文: Linux C語言操作MySQL

1.MySQL數據庫簡介

MySQL是一個開源碼的小型關系數據庫管理系統,體積小,速度快,總體成本低,開源。MySQL有以下特性:

(1) 使用C和C++編寫,并使用了多種編譯器進行測試,保證源碼的可移植性。

(2) 支持多線程,利用CPU資源,支持多用戶。

(3) 可以處理擁有上千萬條記錄的大型數據庫。

(4)既可以作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作為 一個庫而嵌入到其他軟件中去。

?

2. MySQL數據庫的安裝 安裝MySQL數據庫需要三個軟件包:

(1)服務器

(2)客戶端

(3) 開發庫-如果用C或C語言開發,就得安裝開發庫。

MySQL-server-5.5.8-1.rhel5.i386.rpm

MySQL-client-5.5.8-1.rhel5.i386.rpm

MySQL-devel-5.5.8-1.rhel5.i386.rpm 在Linux下用rpm -ivh 安裝即可。

?

3. MySQL的相關目錄

/usr/bin MySQL客戶端程序或腳本

/usr/sbin mysqld服務器相關程序

/var/lib/mysql 日志文件,數據庫數據文件存放目錄

/usr/share/doc/packages 使用手冊,開發文檔存放目錄

/usr/include/mysql 接口函數庫頭文件存放目錄

/usr/lib/mysql 接口函數動態鏈接庫存放目錄

/usr/share/mysql 錯誤消息和字符集文件存放目錄

/usr/share/sql-bench 基本程序存放目錄

?

4. MySQL數據庫的基本操作

(1)啟動MySQL服務器 service mysql start

(2) 停止MySQL服務器 service mysql stop

(3)root用戶指的是MySQL數據庫下的root目錄而不是Linux下的root用戶

為root用戶添加密碼: mysqladmin -u root password 123 //為root用戶添加了新密碼123

修改root用戶密碼為234: mysqladmin -u root -p password 234

Enter password:

或者是: mysqladmin -u root -p password

Enter password:

New password:

Confirm new password:

(4)建立數據庫和表

首先進入用戶下,如在root用戶下建立一個db_record的數據庫: mysql -u root -p

Enter password:

create database db_record

然后切換到當前數據庫下,建立表: use db_record create table friends ( name Char(15),telephone VarChar(20));

最后向表中插入數據 insert into friends (name,telephone) Values ("john","222");

查詢: select * from friends;

(5)建立,刪除用戶及授權

insert into mysql.user(Host,User,Password) values("localhost","min",password("123"));

?flush privileges; //刷新權限列表

grant all privileges on tree.* to min@localhost identified by '123'; //授權min用戶擁有tree數據庫的所有權

?也可以: grant select, insert,update,delete on db_record.* to min@localhost identified by '123';

?刪除用戶: 將該用戶的記錄從MySQL數據庫刪除:

use mysql //切換數據庫

delete from user where user='min' and host='localhost'; //刪除min用戶的記錄

flush privileges; //刷新權限

?

5. C語言操作MySQL數據庫

步驟:

(1)初始化MySQL庫,庫可以是mysqlclient C客戶端庫,或mysqld嵌入式服務器庫,函數 mysql_library_init(),對于與客戶端鏈接的應用程序,提供了改進內存管理的功能。

(2)初始化連接處理程序 mysql_init();主要是用來初始化數據庫標識符,為連接準備

(3)連接到MySQL服務器,mysql_real_connect()函數。

(4) 調用 mysql_close()關閉與MySQL服務器的連接

(5)調用mysql_library_end()函數結束MySQL庫的使用,包括釋放內存,防止內存泄露等操作。

?

下面是用C語言操作MySQL數據庫的例子:

?

    /**

1.連接與查詢MySQL數據庫

連接MySQ數據庫步驟:

(1) 調用mysql_library_init()初始化MySQL數據庫,提供初始化數據庫管理,對于與客戶端鏈接的應用程序,提供了改進的內存管理功能

(2)mysql_init()初始化連接處理程序,并調用mysql_real_connect()函數連接到MySQL服務器

(3)mysql_close()函數關閉與MySQL服務器的連接

(4)mysql_libary_end函數結束MySQL庫的使用,包括釋放內存等操作

mysql_library_init(int argc,char**argv,char**groups)//用來接收應用程序傳遞的參數,如果應用程序不傳遞參數,那么argc=0,argv指針數組中的第一個參數是應用程序名

groups是以NULL為終結的字符串列表中選擇了選項文件中的活動的groups,groups也可以為NULL

mysql_init(MYSQL*mysql)傳遞的參數是數據庫標識符,用于分配或初始化與mysql_real_connect相適應的MYSQL對象,如果mysql的實際參數為NULL指針,將分配初始化新對象,否則初始化對象,并返回對象的地址

mysql_real_connect(MYSQL *mysql,const char* host,const char* user,const char* passwd,const char* db,unsigned int port,const char* unix_socket,unsigned long client_flag)

//嘗試與運行在主機上的MYSQL數據庫引擎建立連接

//第一個參數是可用的MYSQL結構地址,host必須為主機名或ip,如果為NULL或localhost被視為本地主機,user為用戶名,passwd為密碼,db是數據庫名,port為端口號,unix_socket為應使用的套接字,client_flag參數值通常為0

mysql_close(MYSQL*mysql)//關閉連接,釋放對象的內存空間

mysql_library_end()如果不調用該函數,可能造成內存泄露



2.MySQL函數使用

查詢MYSQL數據庫: int mysql_query(MYSQL*mysql,const char* query)

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

//mysql_query函數是以NULL為終結的字符串查詢指向的SQL查詢,不應該為語句加中;或/g

//而mysql_real_query是以計數字符串為終結的查詢

如果查詢字符串包含二進制數據,只能用mysql_real_query,因為二進制數據可能包含/0,導致計算字符串的長度不正確

mysql_real_query比mysql_query快,因為后者需要strlen計算查詢字符串的長度



MYSQL_RES *mysql_store_result(MYSQL *mysql)

MYSQL_RES *mysql_use_result(MYSQL *mysql)

//mysql_store_result將查詢的結果集全部讀取到客戶端,并放于1個MYSQL_RES的結構中去,如果讀取失敗將返回NULL指針

//mysql_use_result函數是初始化結果集檢索,而不是將數據讀取到客戶端,它必須通過mysql_fetch_row()函數對每一行進行檢索

//與mysql_store_result相比,每次只讀取一行,所以速度快,而且不用緩存,內存占用少,僅對當前行與通信緩沖區分配內存即可

MYSQL_ROW mysql_fetch_row(MYSQL_RES*result)//實際檢索來自服務器的行,檢索結果集的下一行

unsigned long *mysql_fetch_lengths(MYSQL_RES *result)//用來返回當前行中的列的長度,該長度有助于信息的優化,能避免用strlen函數,對于包含二數據的結果集,只能用這個函數

void mysql_free_result(MYSQL_RES*result) 函數釋放為mysql_store_result,mysql_use_result分配的結果集內存



mysql_store_result把所有查詢的結果都返回給了客戶端,不僅能連續訪問查詢結果,還能用mysql_row_seek()函數在結果集中向前或向后移動、

還可以調用 mysql_num_rows()來發現有多少行

另一方面,如果數據很大,可能造成內存溢出

mysql_use_result客戶端用于保存查詢結果集的內存較少,每次只返回一條,所以速度比前者快

但不能隨機訪問結果集,只能順序存取,也不能知道查詢結構的總行數

必須快速的處理查詢結構,否則影響服務器的性能,因為查詢操作的會話依然存在

**/

//gcc -g -o  mysql mysql1.c -I/usr/include/mysql -L/usr/lib -lmysqlclient -lpthread -lm -lrt -ldl

//$(mysql_config --cflags) $(mysql_config --libs)



#include <mysql.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

static char* server_groups[]={"embedded","server","this_program_server",(char*)NULL};

int main(){



MYSQL mysql;

MYSQL_RES *res;

MYSQL_ROW row;

char sqlcmd[200];

int t,r;

mysql_library_init(0,NULL,server_groups);//初始化MYSQL數據庫

mysql_init(&mysql);//初始化MYSQL標識符,用于連接

if(!mysql_real_connect(&mysql,"localhost","root","root","db_record",0,NULL,0)){

  fprintf(stderr,"無法連接到數據庫,錯誤原因是:%s/n",mysql_error(&mysql));



}

else {

 puts("數據庫連接成功");

//首先向數據庫中插入一條記錄

 sprintf(sqlcmd,"%s","insert into friends (name,telephone) Values ('xx','xx')");

 mysql_query(&mysql,sqlcmd);

 sprintf(sqlcmd,"%s","select * from friends");

 t=mysql_real_query(&mysql,sqlcmd,(unsigned int)strlen(sqlcmd));



 if(t){

 printf("查詢數據庫失敗%s/n",mysql_error(&mysql));

}

else {

res=mysql_store_result(&mysql);//返回查詢的全部結果集

while(row=mysql_fetch_row(res)){//mysql_fetch_row取結果集的下一行

 for(t=0;t<mysql_num_fields(res);t++){//結果集的列的數量

  printf("%s/t",row[t]);

 }

 printf("/n");



}



mysql_free_result(res);//操作完畢,查詢結果集

}

mysql_close(&mysql);//關閉數據庫連接



}



mysql_library_end();//關閉MySQL庫



return EXIT_SUCCESS;

}







編譯鏈接:
  
    gcc -g -o  mysql mysql1.c -I/usr/include/mysql -L/usr/lib -lmysqlclient -lpthread -lm -lrt -ldl


  
    也可以: gcc -g -o mysql mysql.c $(mysql_config --cflags) $(mysql_config --libs)


  
    解釋:
  
    (1) mysql_config --cflags 尋找mysql編譯相關的頭文件等信息。
  
    (2) mysql_config --libs   尋找mysql編譯所需要的庫函數。
  
    (3) -L/usr/lib 指出靜態庫尋找的路徑。在這里也可以不寫,因為系統會去默認的/lib,/usr/lib去尋找庫函數。如果libmysqlclient.a在/usr/lib/mysql下,那么-L/usr/lib/mysql 這個目錄。
  
    (4)非標準的庫函數,鏈接時用-lmysqlclient.原庫名為libmysqlclient.a去掉lib和.a。
  
    (5) -I是包含頭文件等信息,及include .

(6) 動態鏈接庫的尋找順序:
  
    a. LD_LIBRARY_PATH設置的目錄下.
  
    b. /etc/ld.so.conf 加到這個文件中的目錄。
  
    c. 默認的 /usr/lib,/lib目錄下。



(7)頭文件的尋找順序
  
    a. -I所指定的目錄中去尋找
    
      
      
    
  
    b.gcc的環境變量指定的目錄


    
      C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
    
    

c. /usr/include /usr/local/include 等目錄下尋找。
  
    (8)靜態庫的尋找順序
  
    a. -L所指定的靜態庫尋找路徑
  
    b.gcc環境變量LIBRARY_PATH
  
    c. /lib ,/usr/lib,/usr/local/lib



如果MySQL數據庫啟動不起來,可以先執行killall mysqld ,然后再用service mysql start試試。
  
    關于MySQL數據庫的基本操作就總結到這里了。
  

Linux C語言操作MySQL


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黄色在线观看www | 亚洲第一免费视频 | 91香蕉福利一区二区三区 | 午夜时刻免费实验区观看 | 妖精www视频在线观看高清 | 一区二区三区高清不卡 | 国产成人亚洲精品久久 | 超碰在线小说 | 婷婷网五月天天综合天天爱 | 天天操天天透 | 四虎精品成人免费影视 | 久久国语| 亚洲一级毛片免费在线观看 | 亚洲一级生活片 | 国产毛片久久久久久国产毛片 | 99热久久国产精品免费观看 | 免费真实播放国产乱子伦 | 成人欧美一区二区三区黑人3p | 色综合久久亚洲国产日韩 | 一级片亚洲 | 日本一级毛一级毛片短视频 | 久久官网| 四虎影视成人精品 | videoxxoo欧美老师| 久久免费区一区二区三波多野 | 久久国产亚洲 | 久 在线播放 | 日日日影院 | 久久精品免视着国产成人 | 日本不卡一区二区三区视频 | 欧美啪啪毛片一区二区 | 国产亚洲高清在线精品99 | 久久人人精品 | 四虎影视在线永久免费看黄 | 日韩一级特黄毛片在线看 | 幸福宝色多多 | 伊人激情久久综合中文字幕 | 91久久国产精品视频 | 日韩亚射吧 | 综合亚洲精品一区二区三区 | 日本欧美视频在线 |