摘 要
本文重點(diǎn)介紹了MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)操作,并研究了在C語(yǔ)言中操作MySQL數(shù)據(jù)庫(kù)的基本API,包括MySQL庫(kù)中表的基本定義和常見(jiàn)的數(shù)據(jù)庫(kù)操作如增刪改查、聯(lián)合查詢(xún)等。
【關(guān)鍵詞】C語(yǔ)言 數(shù)據(jù)庫(kù) MySQL
1 引言
1.1 C語(yǔ)言
C語(yǔ)言產(chǎn)生于50年前,是一種常采用的高級(jí)程序語(yǔ)言?;贑語(yǔ)言的設(shè)計(jì)采用相對(duì)簡(jiǎn)單的編譯器,提供低級(jí)訪(fǎng)問(wèn)內(nèi)存與語(yǔ)言結(jié)構(gòu),能有效地將程序語(yǔ)言映射到機(jī)器指令,并提供各種運(yùn)行支持。C語(yǔ)言常用于操作系統(tǒng)、編譯器、數(shù)據(jù)庫(kù)為代表的匯編語(yǔ)言編寫(xiě)的應(yīng)用程序設(shè)計(jì)等。C語(yǔ)言基于其靈活、跨平臺(tái)、高效等特點(diǎn),從微控制器嵌入到超級(jí)計(jì)算機(jī)開(kāi)發(fā)等均被廣泛采用。
C程序的開(kāi)發(fā)通常需要預(yù)編譯、編譯、鏈接、運(yùn)行等階段。預(yù)編譯采用宏替換源碼;編譯過(guò)程將源碼翻譯成二進(jìn)制機(jī)器碼;鏈接過(guò)程將程序采用的靜態(tài)、動(dòng)態(tài)庫(kù)進(jìn)行連接,生成二進(jìn)制可執(zhí)行程序,并在運(yùn)行階段直接運(yùn)行。
1.2 MySQL數(shù)據(jù)庫(kù)
現(xiàn)代常用的數(shù)據(jù)庫(kù)分為關(guān)系型數(shù)據(jù)庫(kù)、分布式數(shù)據(jù)庫(kù)以及NOSQL等幾種類(lèi)型。目前的OLTP(On-Line Transaction Processing,即聯(lián)機(jī)數(shù)據(jù)處理過(guò)程)中多采用以MySQL為代表的關(guān)系型數(shù)據(jù)庫(kù)。
MySQL是一個(gè)由瑞典MySQLAB公司開(kāi)發(fā)的開(kāi)源的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),采用通用的結(jié)構(gòu)化查詢(xún)語(yǔ)言(Structured Query Language),使用C與C++語(yǔ)言編寫(xiě),使用yacc SQL解析器。MySQL源代碼采用GNU通用公共許可證的條款(即開(kāi)源條款),更受各國(guó)開(kāi)發(fā)者的青睞。MySQL的數(shù)據(jù)操作執(zhí)行快速穩(wěn)定、開(kāi)發(fā)接口豐富、開(kāi)發(fā)文檔完善等,被廣泛應(yīng)用于以Web應(yīng)用為代表的程序開(kāi)發(fā)與應(yīng)用。
2 數(shù)據(jù)庫(kù)相關(guān)操作
2.1 連接 MySQL
數(shù)據(jù)庫(kù)連接的命令為“ mysql -h 服務(wù)器Ip地址 -u 用戶(hù)名-p 密碼 ”。假設(shè)遠(yuǎn)程主機(jī)的IP 為:10.0.0.1,用戶(hù)名為root,密碼為psd。則需要輸入以下命令行:
mysql –h10.0.0.1 -uroot –ppsd
2.2 創(chuàng)建數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)的創(chuàng)建命令為(此處DBTest為數(shù)據(jù)庫(kù)名):
Create database DBTest;
顯示數(shù)據(jù)庫(kù)列表命令為(此處DBTest為數(shù)據(jù)庫(kù)名):
show databases DBTest;
使用數(shù)據(jù)庫(kù)命令為(此處DBTest為數(shù)據(jù)庫(kù)名):
use DBTest;
2.3 建立數(shù)據(jù)表
在當(dāng)前使用的數(shù)據(jù)庫(kù)建立數(shù)據(jù)表(此處teacher為表名):
create table teacher
( id varchar(10) not null primary key, //屬性名—ID、長(zhǎng)度10的可變字符串型、不可為空、主鍵name varchar(10) not null, //屬性名—name、長(zhǎng)度10的可變字符串 不可為空year date ); //屬性名-year 日期
3 C程序訪(fǎng)問(wèn)MySQL數(shù)據(jù)庫(kù)
3.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)定義
定義查詢(xún)命令的結(jié)構(gòu)體類(lèi)型:
typedef struct st_mysql {
…
} MYSQL;
定義返回?cái)?shù)據(jù)的結(jié)構(gòu)體類(lèi)型:
typedef struct st_mysql_res {
…
} MYSQL_RES;
3.2 相關(guān)函數(shù)
C語(yǔ)言訪(fǎng)問(wèn)MYSQL數(shù)據(jù)庫(kù)的相關(guān)函數(shù)如表1所示。
MYSQL *mysql_init(MYSQL *mysql) 初始化MYSQL實(shí)例
Void mysql_close(MYSQL *mysql) 關(guān)閉MYSQL實(shí)例,釋放內(nèi)存
Int mysql_query(MYSQL *mysql,const char *query) 對(duì)指定連接進(jìn)行查詢(xún)。成功返回0,出錯(cuò)返回非0值
MYSQL_RES *musql_store_result(MYSQL *handle) 返回查詢(xún)的結(jié)果
MYSQL_ROW mysql_fetch_row(MYSQL_RES *res) 返回第一行查詢(xún)的結(jié)果
3.3 C語(yǔ)言訪(fǎng)問(wèn) MySQL 的程序?qū)嵗?/p>
#include
#include
#include
//定義數(shù)據(jù)庫(kù)查詢(xún)宏(此處根據(jù)參數(shù)userid查詢(xún)teacher表的name year屬性)
#define SELECT_QUERY "select name,year from teacher where userid = %d"
//main函數(shù),C語(yǔ)言執(zhí)行的入口
int main(int argc, char **argv) {
//定義使用的變量
//調(diào)用mysql_init方法,初始化連接實(shí)例
mysql_init(&mysql);
//向數(shù)據(jù)庫(kù)插入數(shù)據(jù)(insert操作),如遇異常則返回
res = mysql_query (&my_connection, "INSERT INTO teacher(name,year) VALUES(Ana, 1989)");
if (res)
fprintf (stderr, "Insert error %d: %s\n", mysql_errno (&my_connection), mysql_error(&my_connection));
}
//修改數(shù)據(jù)(update操作),如遇異常則返回
res = mysql_query (&my_connection, "update teacher set year= 1999 where name =Peter");
if (res)
fprintf (stderr, "Update error %d: %s\n", mysql_errno (&my_connection), mysql_error(&my_connection));
}
sprintf(buf,SELECT_QUERY,atoi(argv[1]));
//查詢(xún)數(shù)據(jù)行(select操作)
if(mysql_query(handle,buf)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(handle)); exit(1);
}
//緩存結(jié)果
If (! (result=mysql_store_result(handle))) {
fprintf(stderr,"Get result from %s failed\n", mysql_error (handle));
exit(1);
}
printf("number of fields returned: %d\n",mysql_num_fields (result));
query ok !
4 結(jié)語(yǔ)
用C語(yǔ)言訪(fǎng)問(wèn) MySQL 在實(shí)際 Web 應(yīng)用中并不多見(jiàn),但是有時(shí)候?yàn)榱双@取更高訪(fǎng)問(wèn)性能,會(huì)直接用C語(yǔ)言來(lái)開(kāi)發(fā)相關(guān)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)模塊,這樣可以更好地利用服務(wù)器的資源,并且使用C語(yǔ)言具有更好的安全性,所以用C語(yǔ)言訪(fǎng)問(wèn)MySQL數(shù)據(jù)庫(kù)相比其他語(yǔ)言雖然在程序開(kāi)發(fā)上成本高一些,但是具備更好的性能和安全性。
參考文獻(xiàn)
[1]吳垠,余瑾,郭磊等.MySQL數(shù)據(jù)庫(kù)在嵌入式Linux平臺(tái)上的移植和應(yīng)用[J].電子技術(shù),2011,38(07):12-13.
[2]趙洪明.MySQL中訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的程序設(shè)計(jì)[J].黃石高等專(zhuān)科學(xué)校學(xué)報(bào),2012,18(01):10-12.
[3]李達(dá).基于知識(shí)庫(kù)的高分辨率遙感影像分割系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].太原:山西大學(xué),2014.
作者簡(jiǎn)介
張麗(1981-)女,漢族,山西省襄汾縣人。碩士學(xué)位?,F(xiàn)為山西管理職業(yè)學(xué)院講師。主要研究方向?yàn)橛?jì)算機(jī)語(yǔ)言。
作者單位
山西管理職業(yè)學(xué)院 山西省臨汾市 041000