標籤:
目錄
1、MYSQL資料結構
2、MYSQL常用函數
3、MYSQL操作流程
4、執行個體
MySQL是一個開源碼的小型關聯式資料庫管理系統,體積小,速度快,總體成本低,開源。MySQL有以下特性:
(1) 使用C和C++編寫,並使用了多種編譯器進行測試,保證源碼的可移植性。
(2) 支援多線程,利用CPU資源,支援多使用者。
(3) 可以處理擁有上千萬條記錄的大型資料庫。
(4)既可以作為一個單獨的應用程式應用在用戶端伺服器網路環境中,也能夠作為 一個庫而嵌入到其他軟體中去。
1、MYSQL資料結構
介紹常用到的MYSQL相關的C變數類型。這些類型在我們後面定義變數的時候會用到
1、MYSQL
要串連MYSQL,必須建立MYSQL執行個體,通過mysql_init初始化方能開始進行串連
樣本:
MYSQL mysql; #建立MYSQL執行個體
mysql_init(&mysql); #初始化開始進行串連
2、MYSQL_RES
這個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。返回的資料稱為“資料集”。 從資料庫讀取資料,最後就是從MYSQL_RES中讀取資料。
PS:類似於JAVA裡面的ResultSet變數一樣,將結果集存入到此變數中再從它裡面去讀資料。
3、MYSQL_ROW
這是一個行資料的型別安全(type-safe)的表示。當前它實現為一個計數位元組的字串數組。行通過調用mysql_fetch_row()獲得
4、MYSQL_FIELD
你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。這個結構包含欄位資訊,例如欄位名、類型和大小。
PS:此變數定義的是列的相關屬性問題!
以下代碼塊是用來串連資料庫的通訊過程,要串連MYSQL,必須建立MYSQL執行個體,通過mysql_init初始化方能開始進行串連.
typedef struct st_mysql {
NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned long thread_id; /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned int server_language;
} MYSQL;
這個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。返回的資料稱為“資料集”,用過資料庫的朋友應該對資料庫中查詢後得到的結果集不會陌生,在C的API裡對應的就是MYSQL_RES了,從資料庫讀取資料,最後就是從MYSQL_RES中讀取資料。
typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int field_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;
2、MYSQL常用函數
所需標頭檔: #include <mysql/mysql.h>
功能: 獲得或初始化一個MYSQL結構
函數原型: MYSQL *mysql_init(MYSQL *mysql)
函數傳回值: 一個被始化的MYSQL*控制代碼
備忘: 在記憶體不足的情況下,返回NULL
所需標頭檔: #include <mysql/mysql.h>
函數功能: 關閉一個伺服器串連,並釋放與串連相關的記憶體
函數原型: void mysql_close(MYSQL *mysql);
函數傳入值: MYSQL:類型的指標
函數傳回值: 無
所需標頭檔: #include <mysql/mysql.h>
函數功能: 串連一個MySQL伺服器
函數原型: MYSQL * mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd);
函數傳入值: mysql表示一個現存mysql結構的地址
host表示MYSQL伺服器的主機名稱或IP
user表示登入的使用者名稱
passwd表示登入的密碼
函數傳回值: 如果串連成功,一個MYSQL *串連控制代碼:如果串連失敗,NULL
備忘: 該函數不推薦,使用mysql_real_connect()代替
所需檔案: #include <mysql/mysql.h>
函數功能: 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 int client_flag);
函數傳入值: mysql表示一個現存mysql結構的地址
host表示MYSQL伺服器的主機名稱或IP
user表示登入的使用者名稱
passwd表示登入的密碼
db表示要串連的資料庫
port表示MySQL伺服器的TCP/IP連接埠
unix_socket表示連線類型
client_flag表示MySQL運行ODBC資料庫的標記
函數傳回值: 如果串連成功,一個MYSQL*串連控制代碼:如果串連失敗,NULL
所需標頭檔: #include <mysql/mysql.h>
函數功能: 返回最新的UPDATE,DELETE或INSERT查詢影響的行數
函數傳入值: MYSQL:類型指標
函數傳回值: 大於零的一個整數表示受到影響或檢索出來的行數。零表示沒有區配查序中WHERE子句的記錄或目前還沒有查詢被執行;-1表示查詢返回一個錯誤,或對於一個SELECT查詢
所需標頭檔: #include <mysql/mysql.h>
函數功能: 對指定的串連執行查詢
函數原型: int mysql_query(MYSQL *mysql,const char *query);
函數傳入值: query表示執行的SQL語句
函數傳回值: 如果查詢成功,為零,出錯為非零。
相關函數: mysql_real_query
所需標頭檔: #include <mysql/mysql.h>
函數功能: 為無緩衝的結果集獲得結果標識符
函數原形: MYSQL_RES *mysql_use_result(MYSQL *mysql);
函數傳入值: MYSQL:類型的指標
函數傳回值: 一個MYSQL_RES結果結構,如果發生一個錯誤發NULL
#incluee <mysql/mysql.h>
檢索一個結果集合的下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
MYSQL_RES:結構的指標
下一行的一個MYSQL_ROW結構。如果沒有更多的行可檢索或如果出現一個錯誤,NULL
#include <mysql/mysql.h>
返回指定結果集中列的數量
unsigned int mysql_num_fields(MYSQL_RES *res);
MYSQL_RES 結構的指標
結果集合中欄位數量的一個不帶正負號的整數
#include <mysql/mysql.h>
建立一個資料庫
int mysql_create_db(MYSQL *mysql,const char *db);
MYSQL:類型的指標
db:要建立的資料庫名
如果資料庫成功地被建立,返回零,如果發生錯誤,為非零。
#include <mysql/mysql.h>
選擇一個資料庫
int mysql_select_db(MYSQL *mysql,const char *db);
MYSQL:類型的指標
db:要建立的資料庫名
如果資料庫成功地被建立,返回零,如果發生錯誤,為非零。
3、MYSQL操作流程
1. 通過調用mysql_library_init(),初始化MySQL庫。庫可以是mysqlclient C用戶端庫,或mysqld嵌入式伺服器庫,具體情況取決於應用程式是否與“-libmysqlclient”或“-libmysqld”標誌連結。
2. 通過調用mysql_init()初始化串連處理常式,並通過調用mysql_real_connect()串連到伺服器。
3. 發出SQL語句並處理其結果。(在下面的討論中,詳細介紹了使用它的方法)。
4. 通過調用mysql_close(),關閉與MySQL伺服器的串連。
5. 通過調用mysql_library_end(),結束MySQL庫的使用。
4、簡單一實例
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
int main(int agrc,char *agrv[])
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
int i;
conn = mysql_init(NULL);//初始化串連
if(conn==NULL)
{
printf("mysql_init error\n");
return EXIT_FAILURE;
}
conn = mysql_real_connect(conn,"localhost","root","123456","test",3306,NULL,0);//串連資料庫
if(conn==NULL)
{
printf("mysql_real_connect error");
}
if(mysql_query(conn,"select *from test"))//執行資料庫操作,可以是insert updata,delete操作
{
printf("select error:%s\n",mysql_error(conn));
}
res =mysql_store_result(conn);
int iNum_rows = mysql_num_rows(res);//得到資料集中有幾行
int iNum_fields=mysql_num_fields(res);//得到資料集中有幾列
printf("rows=%d,fields=%d\n",iNum_rows,iNum_fields);
while((row=mysql_fetch_row(res)))//得到一行結果
{
for(i=0;i<iNum_fields;i++)//顯示資料
{
printf("%s\t",row[i]);
}
printf("\n");
}
mysql_free_result(res);//釋放結果集內容
mysql_close(conn);//中斷連線
return EXIT_SUCCESS;
結果顯示:
}
5、makefile編譯
mysqltest:mysqltest.c
gcc mysqltest.c -L/usr/lib/mysql -lmysqlclient -lstdc++ -ldl -lpthread -lrt -o mysqltest
clean:
rm -f mysqltest
編譯連結:
gcc -g -o mysql mysql1.c -I/usr/include/mysql -L/usr/lib -lmysqlclient -lpthread -lm -lrt -ldl
也可以: gcc -g -o mysql mysql.c $(mysql_config --cflags) $(mysql_config --libs)
解釋:
(1) mysql_config --cflags 尋找mysql編譯相關的標頭檔等資訊。
(2) mysql_config --libs 尋找mysql編譯所需要的庫函數。
(3) -L/usr/lib 指出靜態庫尋找的路徑。在這裡也可以不寫,因為系統會去預設的/lib,/usr/lib去尋找庫函數。如果libmysqlclient.a在/usr/lib/mysql下,那麼-L/usr/lib/mysql 這個目錄。
(4)非標準的庫函數,連結時用-lmysqlclient.原庫名為libmysqlclient.a去掉lib和.a。
(5) -I是包含標頭檔等資訊,及include .
(6) 動態連結程式庫的尋找順序:
a. LD_LIBRARY_PATH設定的目錄下.
b. /etc/ld.so.conf 加到這個檔案中的目錄。
c. 預設的 /usr/lib,/lib目錄下。
(7)標頭檔的尋找順序
a. -I所指定的目錄中去尋找
b.gcc的環境變數指定的目錄C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATHc. /usr/include /usr/local/include 等目錄下尋找。
(8)靜態庫的尋找順序
a. -L所指定的靜態庫尋找路徑
b.gcc環境變數LIBRARY_PATH
c. /lib ,/usr/lib,/usr/local/lib
C語言操作MYSQL資料庫