0基礎(chǔ)的怎么轉(zhuǎn)行互聯(lián)網(wǎng)太原seo排名優(yōu)化公司
文章目錄
- C語(yǔ)言訪問(wèn)Mysql
- 1. 環(huán)境設(shè)置
- 2. mysql接口介紹
- (1) 初始化mysql_init()
- (2) 鏈接數(shù)據(jù)庫(kù)mysql_real_connect
- (3) 下發(fā)mysql命令mysql_query()
- (4) 獲取執(zhí)行結(jié)果mysql_store_result
- (5) 釋放結(jié)果集mysql_free_result()
- (6) 獲取結(jié)果行數(shù)mysql_num_rows
- (7) 獲取結(jié)果列數(shù)mysql_num_fields
- (8) 獲取列名mysql_fetch_fields
- (9) 獲取結(jié)果內(nèi)容mysql_fetch_row
- (10) 關(guān)閉mysql鏈接mysql_close
- 3. 測(cè)試代碼
C語(yǔ)言訪問(wèn)Mysql
1. 環(huán)境設(shè)置
環(huán)境設(shè)置這里我就簡(jiǎn)單介紹一下,參考我mysql環(huán)境安裝的博客:MySQL環(huán)境安裝_Ryujianli的博客-CSDN博客
如果你像我一樣在linux下安裝了mysql,就能在對(duì)應(yīng)的目錄下找到庫(kù)和頭文件
ls /lib64/mysql
ls /usr/include/mysql
如果你找不到,可以再安裝一下
yum install mysql-devel
配置好環(huán)境后,直接打開vscode開始測(cè)試,要#include<mysql/mysql.h>
引入mysql的頭文件
注意makefile文件的寫法:
mytest:test.ccg++ -o mytest test.cc -L/lib64/mysql -lmysqlclient -std=c++11
.PHONY:clean
clean:rm -f mytest
測(cè)試代碼:
#include<iostream>
#include<mysql/mysql.h>int main()
{std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;return 0;
}
如果上面代碼能成功運(yùn)行證明你的庫(kù)引入成功
2. mysql接口介紹
(1) 初始化mysql_init()
要使用庫(kù),必須先進(jìn)行初始化!
MYSQL * mysql_init(MYSQL *mysql)參數(shù)說(shuō)明: mysql設(shè)置為nullptr, 函數(shù)分配,初始化,并返回一個(gè)新的對(duì)象。
返回值: 成功返回一個(gè)MYSQL類型的對(duì)象, 失敗返回nullptr
(2) 鏈接數(shù)據(jù)庫(kù)mysql_real_connect
初始化完畢之后,必須先鏈接數(shù)據(jù)庫(kù),在進(jìn)行后續(xù)操作。(mysql網(wǎng)絡(luò)部分是基于TCP/IP的)
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 clientflag);
參數(shù)說(shuō)明:mysql: 你創(chuàng)建并初始化好的MYSQL類型的對(duì)象, 即mysql_init的返回值host: 這里使用本地環(huán)回地址, 即"127.0.0.1"user: 代表數(shù)據(jù)庫(kù)的使用者passwd: userd的密碼db: 代表你要連接的數(shù)據(jù)庫(kù)名稱port: mysql服務(wù)的端口號(hào), 默認(rèn)是3306unix_socket: unix套接字, 設(shè)置為nullptr代表這里是網(wǎng)絡(luò)通信 clientflag: 設(shè)置為0
返回值:成功返回連接成功的MYSQL對(duì)象, 失敗返回nullptr
第一個(gè)參數(shù) MYSQL是 C api中一個(gè)非常重要的變量(mysql_init的返回值),里面內(nèi)存非常豐富有port, dbname, charset等連接基本參數(shù)。它也包含了一個(gè)叫 st_mysql_methods的結(jié)構(gòu)體變量,該變量里面保存著很多函數(shù)指針,這些函數(shù)指針將會(huì)在數(shù)據(jù)庫(kù)連接成功以后的各種數(shù)據(jù)操作中被調(diào)用。mysql_real_connect函數(shù)中各參數(shù),基本都是顧名思意。
建立好鏈接之后,獲取英文沒(méi)有問(wèn)題,如果獲取中文是亂碼:設(shè)置鏈接的默認(rèn)字符集是utf8,原始默認(rèn)是latin1
mysql_set_character_set(myfd, "utf8");
(3) 下發(fā)mysql命令mysql_query()
int mysql_query(MYSQL *mysql, const char *q);參數(shù)說(shuō)明: 第一個(gè)參數(shù)上面已經(jīng)介紹過(guò)q: 代表你要執(zhí)行的sql語(yǔ)句
返回值:成功返回0, 失敗返回非0
(4) 獲取執(zhí)行結(jié)果mysql_store_result
sql執(zhí)行完以后,如果是查詢語(yǔ)句,我們當(dāng)然還要讀取數(shù)據(jù),如果update,insert等語(yǔ)句,那么就看下操作成功與否即可。我們來(lái)看看如何獲取查詢結(jié)果: 如果mysql_query返回成功,那么我們就通過(guò)mysql_store_result這個(gè)函數(shù)來(lái)讀取結(jié)果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES的介紹:
-
該函數(shù)會(huì)調(diào)用MYSQL變量中的st_mysql_methods中的 read_rows 函數(shù)指針來(lái)獲取查詢的結(jié)果
-
。同時(shí)該函數(shù)會(huì)返回MYSQL_RES 這樣一個(gè)變量,該變量主要用于保存查詢的結(jié)果(調(diào)用mysql_store_result函數(shù)時(shí)是把存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)儲(chǔ)到MYSQL_RES中)。
-
同時(shí)該函數(shù)malloc了一片內(nèi)存空間來(lái)存儲(chǔ)查詢過(guò)來(lái)的數(shù)據(jù),所以一定要使用mysql_free_result() 函數(shù)來(lái)釋放,否則會(huì)造成內(nèi)存泄漏。
-
執(zhí)行完mysql_store_result以后,其實(shí)數(shù)據(jù)都已經(jīng)在MYSQL_RES變量中了。
MYSQL_RES叫做結(jié)果集,我們可以把想象成一個(gè)char**類型的,每一小塊空間里存儲(chǔ)的是一條記錄中的某一個(gè)數(shù)據(jù)所以要用一個(gè)char *類型的指針去指向這一個(gè)數(shù)據(jù),一行的數(shù)據(jù)就構(gòu)成一條記錄,一共有多少條記錄就有多少行,每一行都會(huì)有一個(gè)二維指針去指向這一行
(5) 釋放結(jié)果集mysql_free_result()
void mysql_free_result(MYSQL_RES *result)
(6) 獲取結(jié)果行數(shù)mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
(7) 獲取結(jié)果列數(shù)mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
(8) 獲取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
(9) 獲取結(jié)果內(nèi)容mysql_fetch_row
MYSQL_ROW其實(shí)是char **,可以當(dāng)成一個(gè)二維數(shù)組來(lái)用
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
(10) 關(guān)閉mysql鏈接mysql_close
void mysql_close(MYSQL *sock);
另外,mysql C api還支持事務(wù)等常用操作,大家下來(lái)自行了解:
my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);
3. 測(cè)試代碼
前提:makefile文件的寫法我在環(huán)境設(shè)置部分已經(jīng)說(shuō)明,在使用此代碼測(cè)試前要為自己創(chuàng)建一個(gè)mysql下的普通賬號(hào)并賦予其對(duì)特定數(shù)據(jù)庫(kù)的所有權(quán)限,在我上一個(gè)博客中:
MySQL用戶管理_Ryujianli的博客-CSDN博客
#include<iostream>
#include<mysql/mysql.h>
#include<string>const std::string host="127.0.0.1";
const std::string user="user_l";
const std::string password="1003898";
const std::string db="conn";
const unsigned int port=3306;int main()
{// std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;MYSQL* my=mysql_init(nullptr);if(nullptr ==my){std::cerr<< "init MySQL error" <<std::endl;return 1;}if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cerr<<"connect MySQL error"<<std::endl;return 2;}mysql_set_character_set(my,"utf8");// 增刪改簡(jiǎn)單處理// std::string sql="insert into user (name,age,telephone) values ('張三', 19, '1523467')";// std::string sql="insert into user (name,age,telephone) values ('kitty', 29, '13234567')";// std::string sql="update user set name='Jimmy' where id=2";// std::string sql="delete from user where id=3";// 查的處理std::string sql="select * from user";int n=mysql_query(my,sql.c_str());if(n==0)std::cout<<sql<< " success " <<std::endl;else{std::cout<<sql<< " failed " <<std::endl;return 3;}MYSQL_RES*res=mysql_store_result(my);if(nullptr==res){std::cerr<< "mysql_store_result error" <<std::endl;return 3;}// 全部都是和結(jié)果集有關(guān)的, resint rows=mysql_num_rows(res);int fields=mysql_num_fields(res);std::cout<< "行: "<<rows<<std::endl;std::cout<< "列: "<<fields<<std::endl;// 屬性MYSQL_FIELD*fields_array=mysql_fetch_fields(res);for(int i=0;i<fields;++i){std::cout<<fields_array[i].name<< "\t";}std::cout<< "\n";// 內(nèi)容for(int i=0;i<rows;++i){MYSQL_ROW row= mysql_fetch_row(res); // char**for(int j=0;j<fields;++j){std::cout<<row[j]<< "\t"; // *(row+j)}std::cout<< "\n";} std::cout<<fields_array[0].db<<" "<<fields_array[0].table<<std::endl;// std::cout<<"connect success"<<std::endl;mysql_free_result(res);mysql_close(my);return 0;
}