要使用C語言連接mysql,需要使用mysql官網提供的庫,大家可以去官網下載
我們使用C接口庫來進行連接
要正確使用,我們需要做一些準備工作:
- 保證mysql服務有效
- 在官網上下載合適自己平臺的mysql connect庫,以備后用
下載開發庫
sudo apt-get install libmysqlclient-dev
驗證安裝
ll /usr/include/mysql/
嘗試鏈接mysql client
通過mysql_get_client_info()
函數,來驗證我們的引入是否成功
#include <mysql/mysql.h>
#include <stdio.h> int main() { // 調用 mysql_get_client_info 函數獲取客戶端庫版本信息 const char *client_info = mysql_get_client_info(); // 打印客戶端庫版本信息 if (client_info) { printf("MySQL client library version: %s\n", client_info); } else { printf("Failed to get MySQL client library version.\n"); } // 注意:雖然這個示例沒有實際連接到數據庫,但調用 mysql_get_client_info 不需要連接 // 如果你需要進行數據庫操作,需要初始化 MySQL 庫并連接數據庫,這超出了這個簡單示例的范圍 return 0;
}
$ gcc -o test test.c -I./include -L./lib -lmysqlclient
$ ls
$./test
./test: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
$ export LD_LIBRARY_PATH=./lib
$./test
mysql client version: 6.1.6
至此引入庫的工作已經做完,接下來就是熟悉接口
mysql接口介紹
- 初始化mysql_init()
要使用庫,必須先進行初始化!
MYSQL *mysql_init(MYSQL *mysql);
如: MYSQL *mfp = mysql_init(NULL)
- 鏈接數據庫mysql_real_connect
初始化完畢之后,必須先鏈接數據庫,在進行后續操作。(mysql網絡部分是基于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);
//建立好鏈接之后,獲取英文沒有問題,如果獲取中文是亂碼:
//設置鏈接的默認字符集是utf8,原始默認是latin1
mysql_set_character_set(mfd, "utf8");
第一個參數MYSQL是C api中一個非常重要的變量(mysql_init的返回值),里面內存非常豐富,有port,dbname,charset等連接基本參數。它也包含了一個叫st_mysql_methods
的結構體變量,該變量里面保存著很多函數指針,這些函數指針將會在數據庫連接成功以后的各種數據操作中被調用。mysql_real_connect函數中各參數,基本都是顧名思義。
- 下發mysql命令mysql_query
int mysql_query(MYSQL *mysql, const char *q);
第一個參數上面已經介紹過,第二個參數為要執行的sql語句,如"select * from table"。
- 獲取執行結果mysql_store_result
sql執行完以后,如果是查詢語句,我們當然還要讀取數據,如果update,insert等語句,那么就看下操作成功與否即可。我們來看看如何獲取查詢結果:如果mysql_query返回成功,那么我們就通過mysql_store_result這個函數來讀取結果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
該函數會調用MYSQL變量中的st_mysql_methods中的read_rows函數指針來獲取查詢的結果。同時該函數會返回MYSQL_RES這樣一個變量,該變量主要用于保存查詢的結果。同時該函數malloc了一片內存空間來存儲查詢出來的數據,所以我們一定要記得free(result),不然肯定會造成內存泄漏的。
執行完mysql_store_result以后,其實數據都已經在MYSQL_RES變量中了,下面的api基本就是讀取MYSQL_RES中的數據。
- 獲取結果行數mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 獲取結果列數mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
- 獲取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
for(int i = 0; i < fields; i++){cout<<field[i].name<<" ";
}
cout<<endl;
- 獲取結果內容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它會返回一個MYSQL_ROW變量,MYSQL_ROW其實就是char **,就當成一個二維數組來用吧。
MYSQL_ROW line;
for(int i = 0; i < nums; i++){line = mysql_fetch_row(res);for(int j = 0; j < fields; j++){cout<<line[j]<<" ";}cout<<endl;
}
- 關閉mysql鏈接mysql_close
void mysql_close(MYSQL *sock);
另外,mysql C api還支持事務等常用操作,大家下來自行了解:
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);