有什么做視頻的素材網(wǎng)站新東方烹飪培訓(xùn)學(xué)校
MySQL Connection
? 連接數(shù)據(jù)庫的客戶端除了命令行式的還有圖形化界面版本,網(wǎng)頁版本,當(dāng)然也包括語言級別的庫或者是包,能夠幫助我們直接連接數(shù)據(jù)庫;
一、語言連接庫下載
方式一:不建議使用,需要自己配置環(huán)境變量,或者將庫文件和頭文件添加到系統(tǒng)路徑之下;
? 使用語言連接數(shù)據(jù)庫需要注意安裝相關(guān)的開發(fā)庫;
? 網(wǎng)址:https://www.mysql.com/,然后去downloads選中MySQL Community Downloads;
? 下載連接庫Connector/C++ 8.0,找到對應(yīng)的版本;
方式二:進(jìn)行安裝yum源,然后在進(jìn)行下載并安裝連接庫;
sudo yum install -y mysql-devel
二、使用C/C++訪問數(shù)據(jù)庫
2.1MySQL庫中的常用數(shù)據(jù)結(jié)構(gòu)
MYSQL:這個結(jié)構(gòu)主要用于數(shù)據(jù)庫的連接;
MYSQL_RES:這個結(jié)構(gòu)主要用于保存讀取結(jié)果,以行為單位,用于MYSQL的查詢結(jié)果轉(zhuǎn)儲;
MYSQL_ROW:這個結(jié)構(gòu)主要用于獲取轉(zhuǎn)儲中的一行數(shù)據(jù)記錄,是一個二維數(shù)組;
MYSQL_FIELD:這個結(jié)構(gòu)主要用于獲取轉(zhuǎn)儲中的相關(guān)列屬性,是一個結(jié)構(gòu)化的數(shù)據(jù)類型;
2.2MySQL常用接口
1.使用MySQL必須先進(jìn)行初始化,初始化一些數(shù)據(jù)結(jié)構(gòu);
MYSQL *mysql_init(MYSQL *mysql);
//MYSQL*就相當(dāng)于C語言中的FILE*和系統(tǒng)的fd文件描述符,用來描述MySQL客戶端相關(guān)的資源;也可以稱之為句柄
2.使用MySQL前需要進(jìn)行連接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);
3.修改MySQL字符集
? 需要注意連接之后的編碼集默認(rèn)是latin1;
int mysql_set_character_set(MYSQL *mysql,const char *csname);
4.向MySQL中發(fā)送SQL語句;
? 對于增刪改,只需要執(zhí)行sql即可,但是select需要進(jìn)行后續(xù)操作,將數(shù)據(jù)提交到上層;
? 還需要注意字符集,防止亂碼;
int mysql_query(MYSQL *mysql,const char *stmt_str)//0表示成功,非零表示失敗;
5.當(dāng)不使用了,需要關(guān)閉MYSQL*句柄;
void mysql_close(MYSQL*mysql);
2.3C/C++查詢的處理細(xì)節(jié)
? 當(dāng)查詢完成之后,會將查詢結(jié)果存放到句柄當(dāng)中;此時就需要將查詢結(jié)果提取出來,從句柄當(dāng)中格式化提取到MYSQL_RES中,進(jìn)行轉(zhuǎn)儲,便于進(jìn)行二次處理;
MYSQL_RES *mysql_store_result(MYSQL *mysql);
//需要注意的是,該函數(shù)會malloc一段空間,所以一定要記得進(jìn)行free,否則就會造成內(nèi)存泄露;
void mysql_free_result(MYSQL_RES *result);//使用此函數(shù)進(jìn)行釋放內(nèi)存空間;
? MySQL中存儲的表結(jié)構(gòu),實際上是存儲了兩種內(nèi)容,一種是列屬性名,一種是數(shù)據(jù)內(nèi)容;當(dāng)提取表中的記錄時,就不會考慮約束了,而是i直接提取出來字符串;
? 可以將MYSQL_RES結(jié)構(gòu)看作一個char** array[]的結(jié)構(gòu),其中的一個數(shù)組會被當(dāng)作一行記錄,每一條記錄由不同的列構(gòu)成,不同的列是一個字符串;這樣既可以按照行讀取,也可以按照列進(jìn)行讀取;
? 為了便于遍歷,需要獲取行數(shù)和列數(shù),就需要用到以下接口實現(xiàn);
unsigned int mysql_num_fields(MYSQL_RES *result);//返回列數(shù)
my_ulonglong mysql_num_rows(MYSQL_RES *result);//返回行數(shù),此時的行數(shù)表示的是數(shù)據(jù)內(nèi)容,不包括列名稱;
? 直接獲取一行的結(jié)果;再重復(fù)使用下列函數(shù)的過程當(dāng)中,會自動遍歷到下一行;
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);//返回值本質(zhì)上就是一個char**也就是一個二維數(shù)組;
? 獲取列名使用如下接口;
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)//一次性獲取所有的列;
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)//一個一個的獲取,并每次使用會自動下后一個迭代;
示例
#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>
#include <string>
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::string;const string host = "localhost";
const string user = "user_for_C";
const string password = "dyh15343510133.";
const string database = "for_comm_user_C";
const unsigned int port = 8080;int main()
{// MYSQL對象初始化MYSQL *my = mysql_init(nullptr);if (my == nullptr){cerr << "init mysql error" << endl;return 1;}// 連接MYSQLif (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), database.c_str(), port, nullptr, 0) == nullptr){cerr << "connect mysql error" << endl;return 2;}cout << "connect mysql success" << endl;if (mysql_set_character_set(my, "utf8")){cerr << "設(shè)置字符集失敗" << endl;return 3;}// 發(fā)送SQL語句string sql = "select * from user";if (mysql_query(my, sql.c_str())){cerr << "query error" << endl;}else{cout << "query success" << endl;}// 獲取查詢結(jié)果MYSQL_RES *myres = mysql_store_result(my);if (nullptr == myres){cerr << "mysql_store_result error" << endl;return 4;}int rows = mysql_num_rows(myres);int columns = mysql_num_fields(myres);cout << "行數(shù):" << rows << ",列數(shù):" << columns << endl;// 表的屬性MYSQL_FIELD *fields = mysql_fetch_fields(myres);for (int i = 0; i < columns; i++){cout << fields[i].name << "\t\t";}cout << endl;// 表的內(nèi)容for (int i = 0; i < rows; i++){MYSQL_ROW row = mysql_fetch_row(myres);for (int j = 0; j < columns; j++){cout << row[j] << "\t\t";}cout << endl;}// string sql;// while (true)// {// cout << "mysql>>>";// if (!std::getline(cin, sql) || sql == "quit")// {// cout << "Bye" << endl;// break;// }// int n = mysql_query(my, sql.c_str());// if (n == 0)// {// cout << sql << " success: " << n << endl;// }// else// {// cerr << sql << " error: " << n << endl;// }// }// 釋放結(jié)果集mysql_free_result(myres);// MYSQL對象關(guān)閉mysql_close(my);return 0;
}
三、圖形化界面連接數(shù)據(jù)庫
? 如Navicat就是使用體驗較好的一個圖形化界面,但是是一個收費的方案;還有一款是MySQL Workbench,是官方提供的一種圖形化界面方案,是一種免費的方案;