如何使用C/C++鏈接mysql數(shù)據(jù)庫
一、安裝數(shù)據(jù)庫
安裝我們要使用的數(shù)據(jù)庫有兩種方法
- 手動安裝包導(dǎo)入
在數(shù)據(jù)庫的官網(wǎng)找到對應(yīng)版本的安裝包,然后導(dǎo)入自己的系統(tǒng)庫中去,在項目需要時用include包一下頭庫文件即可 - 直接用系統(tǒng)指令下載
以Ubantu20.04舉例
sudo apt install -y libmysqlclient-dev
這樣我們的庫中就將mysql安裝包下載好了,在使用時如果報錯記得在編譯時包一下頭文件和庫文件的路徑
例如:
g++ -o $@ $^ -I./include -L./lib -lmysqlclient
如果找不到可以使用下面的指令,可以找出這個庫安裝的所有文件的路徑
dpkg -L libmysqlclient-dev

include 包含所有的方法聲明, lib 包含所有的方法實現(xiàn)(打包成庫)
二、接口使用
1.初始化
使用庫之前先初始化
MYSQL *mysql_init(MYSQL *mysql);
例:
//1.初始化
if(my==nullptr)
{
std::cerr<<"init error"<<std::endl;
return 1;
}2.鏈接
初始化完畢之后,必須先鏈接數(shù)據(jù)庫,在進(jìn)行后續(xù)操作
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);
舉例:
//2.連接
if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr)
{
std::cerr<<"connect error"<<std::endl;
return 2;
}
如果發(fā)現(xiàn)自己數(shù)據(jù)出現(xiàn)亂碼的情況,可能是編碼沒有將編碼沒有設(shè)置好
默認(rèn)是latin,可以顯示英文,但要顯示中文需將默認(rèn)字符集改為utf_8
mysql_set_character_set(myfd, "utf8");
3.執(zhí)行mysql命令
int mysql_query(MYSQL *mysql, const char *q);
第一個參數(shù)為初始化的返回值,第二個參數(shù)為要執(zhí)行的sql語句,如“select * from table”
//3.命令
std::string sql="select * from users";
int n=mysql_query(my,sql.c_str());
if(n==0)
{
std::cout<<"query "<<sql<<" success"<<std::endl;
}
else
{
std::cerr<<"query "<<sql<<" error"<<std::endl;
return 3;
}
到這里如果我們執(zhí)行的是增刪改等修改操作的話,就已經(jīng)成功執(zhí)行了,但如果是要執(zhí)行查找等需要查看結(jié)果的SQL語句,我們就還需要通過一個接口來獲取查找的數(shù)據(jù)
4.查看執(zhí)行結(jié)果數(shù)據(jù)
MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES* res = mysql_store_result(my);
該函數(shù)會調(diào)用MYSQL變量中的st_mysql_methods中的 read_rows 函數(shù)指針來獲取查詢的結(jié)果。
同時該函數(shù)會返回MYSQL_RES 這樣一個變量,該變量主要用于保存查詢的結(jié)果,同時malloc了一片內(nèi)存空間來存儲查詢過來的數(shù)據(jù),所以我們一定要記的 free(result),不然是肯定會造成內(nèi)存泄漏的。
執(zhí)行完mysql_store_result以后,其實數(shù)據(jù)都已經(jīng)在MYSQL_RES 變量中了,下面的api就是來讀取MYSQL_RES 中的數(shù)據(jù)。
- 獲取結(jié)果行數(shù)mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 獲取結(jié)果列數(shù)mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
- 獲取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
- 獲取列名屬性
//屬性
MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
for(int i=0;i<fields;i++)
{
std::cout<<fields_array[i].name<<"\t";
}
std::cout<<std::endl;

- 獲取數(shù)據(jù)
//數(shù)據(jù)
for(int i=0;i<rows;i++)
{
MYSQL_ROW row = mysql_fetch_row(res);
for(int j=0;j<fields;j++)
{
std::cout<<row[j]<<"\t";
}
std::cout<<std::endl;
}

5.釋放空間,關(guān)閉mysql鏈接
// 釋放結(jié)果空間 mysql_free_result(res); // 關(guān)閉mysql連接 mysql_close(my);
- C++連接數(shù)據(jù)庫SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、MongoDB、Redis
- 使用C++實現(xiàn)MySQL數(shù)據(jù)庫連接池
- C/C++連接MySQL數(shù)據(jù)庫詳細(xì)圖文教程
- C++連接mysql數(shù)據(jù)庫(改進(jìn)版)
- C/C++代碼操作MySQL數(shù)據(jù)庫詳細(xì)步驟
- 如何利用C++實現(xiàn)mysql數(shù)據(jù)庫的連接池詳解
- C++連接并使用MySQL數(shù)據(jù)庫
- C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié)
- C/C++ 連接MySql數(shù)據(jù)庫的方法
相關(guān)文章
mySQL UNION運算符的默認(rèn)規(guī)則研究
SQL UNION運算符的默認(rèn)規(guī)則研究,學(xué)習(xí)union的朋友可以參考下。2009-07-07
Mysql中TIMESTAMPDIFF函數(shù)的語法與練習(xí)案例
在應(yīng)用時經(jīng)常要使用這兩個函數(shù)TIMESTAMPDIFF和TIMESTAMPADD,下面這篇文章主要給大家介紹了關(guān)于Mysql中TIMESTAMPDIFF函數(shù)的語法與練習(xí)案例的相關(guān)資料,需要的朋友可以參考下2022-09-09
MySQL啟動報錯問題InnoDB:Unable to lock/ibdata1 error
這篇文章主要介紹了MySQL啟動報錯問題InnoDB:Unable to lock/ibdata1 error,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
MySQL和連接相關(guān)的timeout 的詳細(xì)整理
這篇文章主要介紹了MySQL和連接相關(guān)的timeout 的詳細(xì)整理的相關(guān)資料,本文主要總結(jié)下和連接有關(guān)的timeout,需要的朋友可以參考下2017-08-08

