????????MySQL要想在C/C++下使用,就必須要有 MySQL 提供的頭文件和相關的庫。
????????在Ubuntu系統上,使用?apt install mysql-server?安裝MySQL服務器后,僅安裝了MySQL數據庫服務本身,并沒有安裝MySQL開發所需的庫和頭文件。因此,在嘗試用C/C++編寫訪問MySQL數據庫的應用程序時,編譯器找不到相應的MySQL頭文件(如)和相關的庫,導致無法正常編譯。
? ? ? ? 使用C/C++訪問數據庫時,需要安裝MySQL提供的開發包,這些包包含了進行MySQL開發所需的頭文件和庫文件。Ubuntu系統下安裝的MySQL服務,可以使用以下指令安裝MySQL開發庫。
sudo apt install default-libmysqlclient-dev
? ? ? ? 注意:MySQL開發庫的版本要與MySQL服務器一致,否則某些情況下會出現不兼容問題。??
? ? ? ? 在Ubuntu系統下安裝好MySQL后,頭文件在?/usr/include/mysql 路徑下(/usr/include是系統搜索頭文件的默認路徑),庫文件在?/usr/lib/x86_64-linux-gnu/ 路徑下(系統鏈接庫時默認的查找路徑)。
? ? ? ? 下面通過 mysql_get_client_info() 函數,來驗證我們的引入是否成功。
#include <cstdio>
#include <mysql/mysql.h>
int main()
{
? ? printf("mysql client Version: %s\n", mysql_get_client_info());
? ? return 0;
}
// 下面指令生成失敗,因為沒有鏈接MySQL庫
zhu@iv-ydi2mepybkcva4ghjhmx:~/mysql$ g++ test.cc -o test??
// 鏈接MySQL庫,成功生成
zhu@iv-ydi2mepybkcva4ghjhmx:~/mysql$ g++ test.cc -o test -lmysqlclient??
? ? ? ? C/C++對應MySQL的接口和使用流程請觀看此文章:MySQL操作函數接口。
MySQL通用接口:
????????初始化一個MYSQL連接的實例對象。
????????MYSQL * mysql_init(MYSQL *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);?????????用于向 MySQL 服務器發送 SQL 語句并執行它。
????????int mysql_query(MYSQL *mysql, const char *stmt_str);
獲取MySQL結果:
????????mysql_store_result是從 MySQL 服務器獲取查詢結果集的一個函數。當執行了一個select?查詢或其他會產生結果集的查詢(如show)后,可以使用該函數來將整個結果集一次性加載到客戶端內存中。
??????MYSQL_RES *mysql_store_result(MYSQL *mysql);
??????mysql_store_result 獲取結果集后,下面就是讀取獲取結果集中的數據。
? ? ? 獲取結果行數:my_ulonglong mysql_num_rows(MYSQL_RES *res);
??????獲取結果列數:unsigned int mysql_num_fields(MYSQL_RES *res);
??????獲取結果集中每個列的屬性信息:
??????????????MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
??????獲取結果集中的數據:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
? ? ?
??????說明:my_ulonglong其實就是int64_t;
? ? ? ? ? ???????MYSQL_FIELD是一個結構體,mysql_fetch_fields實際返回的就是結構體數? ? ? ? ? ? 組,數組的每個元素對應一個列的屬性信息;
? ? ? ? ? ? ????MYSQL_ROW其實就是char**,可以當成一個二維數組來用,每一列對應數組中? ? ? ? 的一個元素
注意:
???? ? ?1,建立好鏈接之后,獲取英文沒有問題,如果獲取中文是亂碼,那么說明設置鏈接的字符集與數據庫不匹配。這里需要運用 mysql_set_character_set 修改字符集。
????????mysql_set_character_set(myfd, "utf8");? ? myfd使用utf8字符集,原始默認是latin1
? ? ? ? 2,mysql_store_result函數存儲結果集時,內部malloc了一片內存空間來存儲查詢過來的數據,執行完畢后,需要 void mysql_free_result(MYSQL_RES *result) 函數來釋放資源。
? ? ? ? 代碼實例請在此鏈接下觀看:C++代碼運用MySQL
? ? ? ? 下面來說明下?show processlist?命令。
????????show processlist?是 MySQL 中用于顯示當前所有連接到 MySQL 服務器的連接(即線程)以及其狀態的命令。每個連接在 MySQL 中都表示為一個線程。該指令提供了查看這些線程詳細信息的方法。輸出字段說明如下:
- Id:每個線程的唯一標識符。
- User:發起該線程的用戶名。
- Host:發起該線程的客戶端主機名或IP地址(以及端口號)。如果通過TCP/IP連接,格式通常是:[hostname]:[port];如果是本地連接,則可能是localhost
。
- db:當前線程正在使用的數據庫名稱。如果沒有選擇任何數據庫,則此列為NULL。
- Command:線程正在執行的操作類型。例如,sleep表示線程處于空閑等待狀態;query表示線程正在執行查詢。
- Time:線程處于其當前狀態的時間,以秒為單位。
- State:線程的狀態,提供了關于線程當前活動的更詳細的信息。不同的命令可能有不同的狀態。
- Info:正在執行的SQL語句文本。如果線程沒有執行任何語句,則此列為NULL。