C APIs包含在MySQLclient庫(kù)文件當(dāng)中,與MySQL的源代碼一塊發(fā)行,用于連接到數(shù)據(jù)庫(kù)和執(zhí)行數(shù)據(jù)庫(kù)查詢
locate mysql.h 命令可以查看mysql.h 位于/user/include/mysql/mysql.h
一個(gè)小例子來(lái)看一下mysql api 大概用法,用于打印hello world:
int main()
{
int ret = NULL;
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、重慶小程序開(kāi)發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了太原免費(fèi)建站歡迎大家使用!
MYSQL mysql;
MYSQL *connect;
//MYSQL_RES *res;
//MYSQL_ROW row;
//char *query;
//int t, r;
/*
if (mysql_library_init(0, NULL, NULL)) {
fprintf(stderr, "could not initialize MySQL library\n");
exit(1);
}
*/
mysql_init(&mysql);//初始化mysql
/*
MYSQL *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)
*/
/*
unsigned int mysql_errno(MYSQL *mysql);
const char *mysql_error(MYSQL *mysql);
*/
connect = mysql_real_connect(&mysql, "localhost", "root", "mysql", "pos", 0, NULL, 0 );
if (connect == NULL)
{
ret = mysql_errno(connect);
printf("func mysql_real_connect() err\n");
return ret;
}
else
{
printf(" ok......\n");
}
printf("connect:%d &mysql:%d \n",connect, &mysql );
mysql_close(connect);
//mysql_library_end();
}
從上面可以看出有幾個(gè)比較重要的函數(shù)
(1)MYSQL mysql_init(MYSQL mysql)
描述
分配或初始化與mysql_real_connect()相適應(yīng)的MYSQL對(duì)象。如果mysql是NULL指針,該函數(shù)將分配、初始化、并返回新對(duì)象。否則,將初始化對(duì)象,并返回對(duì)象的地址。如果mysql_init()分配了新的對(duì)象,當(dāng)調(diào)用mysql_close()來(lái)關(guān)閉連接時(shí)。將釋放該對(duì)象。
返回值
初始化的MYSQL*句柄。如果無(wú)足夠內(nèi)存以分配新的對(duì)象,返回NULL。
錯(cuò)誤
在內(nèi)存不足的情況下,返回NULL。
(2) mysql_real_connect()
MYSQL 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_real_connect()嘗試與運(yùn)行在主機(jī)上的MySQL數(shù)據(jù)庫(kù)引擎建立連接。在你能夠執(zhí)行需要有效MySQL連接句柄結(jié)構(gòu)的任何其他API函數(shù)之前,mysql_real_connect()必須成功完成。
參數(shù)的指定方式如下:
· 第1個(gè)參數(shù)應(yīng)是已有MYSQL結(jié)構(gòu)的地址。調(diào)用mysql_real_connect()之前,必須調(diào)用mysql_init()來(lái)初始化MYSQL結(jié)構(gòu)。通過(guò)mysql_options()調(diào)用,可更改多種連接選項(xiàng)。
· “host”的值必須是主機(jī)名或IP地址。如果“host”是NULL或字符串"localhost",連接將被視為與本地主機(jī)的連接。如果操作系統(tǒng)支持套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連接到服務(wù)器。
· “user”參數(shù)包含用戶的MySQL登錄ID。如果“user”是NULL或空字符串"",用戶將被視為當(dāng)前用戶。在UNIX環(huán)境下,它是當(dāng)前的登錄名。在Windows ODBC下,必須明確指定當(dāng)前用戶名。
· “passwd”參數(shù)包含用戶的密碼。如果“passwd”是NULL,僅會(huì)對(duì)該用戶的(擁有1個(gè)空密碼字段的)用戶表中的條目進(jìn)行匹配檢查。這樣,數(shù)據(jù)庫(kù)管理員就能按特定的方式設(shè)置MySQL權(quán)限系統(tǒng),根據(jù)用戶是否擁有指定的密碼,用戶將獲得不同的權(quán)限。
注釋:調(diào)用mysql_real_connect()之前,不要嘗試加密密碼,密碼加密將由客戶端API自動(dòng)處理。
· “db”是數(shù)據(jù)庫(kù)名稱。如果db為NULL,連接會(huì)將默認(rèn)的數(shù)據(jù)庫(kù)設(shè)為該值。
· 如果“port”不是0,其值將用作TCP/IP連接的端口號(hào)。注意,“host”參數(shù)決定了連接的類型。
· 如果unix_socket不是NULL,該字符串描述了應(yīng)使用的套接字或命名管道。注意,“host”參數(shù)決定了連接的類型。
· client_flag的值通常為0,但是,也能將其設(shè)置為下述標(biāo)志的組合,以允許特定功能:
1.CLIENT_MULTI_STATEMENTS
通知服務(wù)器,客戶端可能在單個(gè)字符串內(nèi)發(fā)送多條語(yǔ)句(由‘;’隔開(kāi))。如果未設(shè)置該標(biāo)志,將禁止多語(yǔ)句執(zhí)行。
2.CLIENT_COMPRESS
使用壓縮協(xié)議。
3.CLIENT_SSL
使用SSL(加密協(xié)議)。該選項(xiàng)不應(yīng)由應(yīng)用程序設(shè)置,它是在客戶端庫(kù)內(nèi)部設(shè)置的
MySQL開(kāi)發(fā)環(huán)境熟悉
?mysq的開(kāi)發(fā)頭文件目錄為 /usr/include/mysql 可以用locate mysql.h或者find命令查看(find / -name "mysql.h" -type f -print)
?
mysq的開(kāi)發(fā) 動(dòng)態(tài)庫(kù)同上可以查找到libmysqlclient.so 在/usr/lib64/mysql下
編譯命令:
?gcc -o dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql –lmysqlclient (-I 指定頭文件路徑 -L指定庫(kù)路徑)
?典型錯(cuò)誤1
/
/usr/lib64/mysql/libmysqlclient.a(dso_dlfcn.o): In function dlfcn_globallookup':
dlopen'
dso_dlfcn.c:(.text+0x31): undefined reference to
dso_dlfcn.c:(.text+0x44): undefined reference to dlsym'
dlclose'
dso_dlfcn.c:(.text+0x4f): undefined reference to
//libmysqlclient.a dlfcn_globallookup undefined reference to `dlopen'
/
分析:由dlopen ,dllsym可知缺少dl庫(kù) 只需 編譯時(shí)加上 -ldl
?典型錯(cuò)誤2
/
dm01_hello.c:49: 警告:初始化將指針賦給整數(shù),未作類型轉(zhuǎn)換
/usr/lib64/mysql/libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.gxx_personality_v0[DW.ref.gxx_personality_v0]+0x0): undefined reference to __gxx_personality_v0'
scramble_323':
/usr/lib64/mysql/libmysqlclient.a(password.c.o): In function
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'
floor'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'
floor'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'
floor' follow
/usr/lib64/mysql/libmysqlclient.a(password.c.o):/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: more undefined references to
/usr/lib64/mysql/libmysqlclient.a(my_getsystime.c.o): In function `my_getsystime':
/
分析: 由undefined reference to floor‘’ 可知缺少數(shù)學(xué)庫(kù),鏈接上數(shù)學(xué)庫(kù) -lm -lrt即可!
__gxx_personality_v0'
?典型錯(cuò)誤3
dm01_hello.c:70: 警告:初始化將指針賦給整數(shù),未作類型轉(zhuǎn)換
//導(dǎo)致沒(méi)有鏈接 libstdc++.so
/usr/lib64/mysql/libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to
分析:由undefined reference to `__gxx_personality_v0'可知沒(méi)有鏈接 libstdc++.so,只需-lstdc++即可
于是:
MySQL開(kāi)發(fā)環(huán)境GCC寫(xiě)法
?gcc -o dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++
以上一般針對(duì)64位系統(tǒng)出現(xiàn)的問(wèn)題,對(duì)于32位系統(tǒng)無(wú)需這樣,只需
gcc -o dm01_hello dm01_hello.c -lmysqlclient 即可!
因?yàn)?2位環(huán)境下已經(jīng)做了相應(yīng)的工作!
上面寫(xiě)的是不是很麻煩呢!有沒(méi)有簡(jiǎn)單一點(diǎn)的寫(xiě)法呢?有,引入makefile
MySQL開(kāi)發(fā)環(huán)境makefile寫(xiě)法
.PHONY:clean all #聲明為偽目標(biāo)
CC=gcc
CFLAGS=-Wall -g
LFLAGS=-L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++
BIN=dm01_hello dm02_query
all:$(BIN)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
dm01_hello:dm01_hello.o
$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@
dm02_query:dm02_query.o
$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@
clean:
rm -f *.o $(BIN)
大概說(shuō)一下幾個(gè)細(xì)節(jié):
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
其中%.o 和%.c會(huì)自動(dòng)展開(kāi)
$@目標(biāo) $< 第一個(gè)依賴 $^所有依賴
如上:
dm01_hello.o dm02_query.o : dm01_hello.c dm02_query.c
gcc -Wall -g -c dm01_hello.c -o dm01_hello.o
gcc -Wall -g -c dm02_query.c -o dm02_query.o
大概就是這個(gè)意思
下面將接著說(shuō),請(qǐng)看下一節(jié)!
mysql api---從一個(gè)小例子開(kāi)始mysql編程入門(mén)(2)