Linux C語言操作MySQL

來源:互聯網
上載者:User

標籤:

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 [email protected] identified by ‘123‘; //授權min使用者擁有tree資料庫的所有權

 也可以: grant select, insert,update,delete on db_record.* to [email protected] 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也可以為NULLmysql_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參數值通常為0mysql_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_PATHc. /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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.