標籤:
MySQL基礎及MySQL C API編程
一、MySQL For Windows安裝:
1. 下載:
上官網下載即可:
http://www.mysql.com/downloads/
2. 安裝:
沒有什麼好說的,傻瓜式,也沒有什麼要注意的。
3. 配置:
添加系統變數MYSQL_HOME和修改PATH,目的就是讓系統預設能夠找到MySQL命令。(安裝目錄的/bin下面)
PS:
補充一下,有的朋友可能下載的是免安裝版本,拷貝到一個地方就可以了,這個時候,配置還是需要的,但是配置完成之後,需要手動安裝MySQL服務。因為我們是想既要搭建MySQL伺服器端,又要搭建MySQL用戶端,伺服器端是需要開啟服務的,所以需要手動安裝並啟動mysql服務。還有就是要注意,網上的一些WAMP整合安裝包,只包含了SQL web有關的工具,是不全的,需要安裝200多M的那個版本。
相關的幾個命令如下:
mysqld -install //安裝mysql服務mysqld -remove //卸載mysql服務net start mysql //啟動mysql服務net stop mysql //停止mysql服務mysqladmin -version //查看mysql服務是否安裝成功
也可以通過Windows的服務工具來配置MySQL。
二、MySQL基礎:
1. 串連MySQL:
首先再明確一個概念,現在我們是在學習如何使用MySQL,我們的MySQL伺服器端是安裝在本機上,MySQL用戶端也是安裝在本機上的。我們登入MySQL就是通過CMD命令列工具,用用戶端命令mysql登入到本機MySQL伺服器端,本機開啟的服務是MySQL,進程是mysql.exe。
安裝完成之後,預設的Host和User是:
其中密碼都為空白。
我們有兩種方式串連mysql伺服器,不指定Host/User/Password預設就是按照localhost匿名使用者的方式串連。
退出的mysql伺服器使用命令exit或者quit。
mysql //localhost+匿名方式登入mysql -u root -p //localhost+root+password方式登入exit //退出mysql伺服器
2. 修改mysql伺服器使用者密碼:
mysqladmin -u root -p password //中間提示輸入當前密碼一次,新密碼兩次
3. MySQL基礎文法:
mysqladmin -u root -p create RUNOOB
mysqladmin -u root -p drop RUNOOB
mysql> show databases; //注意後面要加;號,表示一條mysql語句結束
mysql> use RUNOOB;
http://www.runoob.com/mysql/mysql-data-types.html
mysql> show tables;
mysql> CREATE TABLE runoob_tbl( -> runoob_id INT NOT NULL AUTO_INCREMENT, -> runoob_title VARCHAR(100) NOT NULL, -> runoob_author VARCHAR(40) NOT NULL, -> submission_date DATE, -> PRIMARY KEY ( runoob_id ) -> );
mysql> DROP TABLE runoob_tbl
mysql> INSERT INTO runoob_tbl ->(runoob_title, runoob_author, submission_date) ->VALUES ->("Learn PHP", "John Poul", NOW());
SELECT * from runoob_tbl
SHOW DATABASES; //列出 MySQL Server上的資料庫SHOW TABLES [FROM db_name]; //列出資料庫中的表SHOW TABLE STATUS [FROM db_name]; //列出資料庫的表資訊,比較詳細SHOW COLUMNS FROM tbl_name [FROM db_name]; //列出表的列資訊,同 SHOW FIELDS FROM tbl_name [FROM db_name],DESCRIBE tbl_name [col_name]SHOW FULL COLUMNS FROM tbl_name [FROM db_name]; //列出表的列資訊,比較詳細,同 SHOW FULL FIELDS FROM tbl_name [FROM db_name]SHOW INDEX FROM tbl_name [FROM db_name]; //列出表的索引資訊SHOW STATUS; //列出 Server 的狀態資訊SHOW VARIABLES; //列出 MySQL 系參數值SHOW PROCESSLIST; //查看當前mysql查詢進程SHOW GRANTS FOR user; //列出使用者的授權命令
mysql> SELECT * from runoob_tbl WHERE runoob_author=‘Sanjay‘; //查詢某一個合格表項
//查詢並修改表中的一項,最後更新表格mysql> UPDATE runoob_tbl -> SET runoob_title=‘Learning JAVA‘ -> WHERE runoob_id=3;
mysql> DELETE FROM runoob_tbl WHERE runoob_id=3; //刪除表中的某一項
mysql> ALTER TABLE testalter_tbl DROP i; //刪除以上表的 i 欄位mysql> ALTER TABLE testalter_tbl ADD i INT; //在表 testalter_tbl 中添加 i 欄位,並定義資料類型mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10); //把欄位 c 的類型從 CHAR(1) 改為 CHAR(10)mysql> ALTER TABLE testalter_tbl -> MODIFY j BIGINT NOT NULL DEFAULT 100; //指定欄位 j 為 NOT NULL 且預設值為100mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; //使用 ALTER 來修改欄位的預設值mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; //使用 ALTER 命令及 DROP子句來刪除欄位的預設值mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl; //修改表名
Regex是通用的,和C、linux shell一樣的。
mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st‘; //尋找name欄位中以‘st‘為開頭的所有資料mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘ok$‘; //尋找name欄位中以‘ok‘為結尾的所有資料mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘mar‘; //尋找name欄位中包含‘mar‘字串的所有資料mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^[aeiou]|ok$‘; //尋找name欄位中以母音字元開頭且以‘ok‘字串結尾的所有資料
4. MySQL鍵和索引的概念:
http://www.runoob.com/mysql/mysql-index.html
http://blog.csdn.net/duck_arrow/article/details/8264686
http://www.jb51.net/article/34037.htm
三、MySQL C API編程:
實質就是C語言調用libmysql.lib庫,使用其提供的的函數來串連,訪問,修改MySQL資料庫中的內容。
1. MYSQL結構體:
這個結構主要用於串連,儲存一些串連的資訊。
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;
2. MYSQL_RES結構體:
這個結構主要是返回一些操作資料庫(SELECT, SHOW, DESCRIBE, EXPLAIN等)的結果,即“資料集”。
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;
3. MySQL C API編程步驟:
具體有哪些函數,可以到網上搜尋一下相關介紹,這裡講一下編程步驟:
(1)、首先我們要包含mysql的標頭檔,並連結mysql動態庫。即添加以下語句:
#include <WinSock2.h> // 進行網路編程需要winsock2.h #include <mysql.h> #pragma comment(lib, "libmysql.lib")
(2)、建立MYSQL變數。如:
MYSQL mysql;
(3)、初始化MYSQL變數。
mysql_init(&mysql);
(4)、調用mysql_real_connect函數串連Mysql資料庫。mysql_real_connect函數的原型如下:
MYSQL * STDCALL 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); 參數說明:mysql--前面定義的MYSQL變數;host--MYSQL伺服器的地址;user--登入使用者名稱;passwd--登入密碼;db--要串連的資料庫;port--MYSQL伺服器的TCP服務連接埠;unix_socket--unix串連方式,為NULL時表示不使用socket或管道機制;clientflag--Mysql運行為ODBC資料庫的標記,一般取0。串連失敗時該函數返回0。
(5)、調用mysql_real_query函數進行資料庫查詢。mysql_real_query函數的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);參數說明:mysql--前面定義的MYSQL變數;q--SQL查詢語句;length--查詢語句的長度。查詢成功則該函數返回0。
(6)、通過調用mysql_store_result或mysql_use_result函數返回的MYSQL_RES變數擷取查詢結果資料。
兩個函數的原型分別為:MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);這兩個函數分別代表了擷取查詢結果的兩種方式。第一種,調用端,然後讀取;第二種,調用mysql_use_result初始化檢索,以便於後面一行一行的讀取結果集,而它本身並沒有從伺服器讀取任何資料,這種方式較之第一種速度更快且所需記憶體更少,但它會綁定伺服器,阻止其他線程更新任何錶,而且必須重複執行mysql_fetch_row讀取資料,直至返回NULL,否則未讀取的行會在下一次查詢時作為結果的一部分返回,故經常我們使用mysql_store_result。
(7)、調用mysql_fetch_row函數讀取結果集資料。
上述兩種方式最後都是重複調用mysql_fetch_row函數讀取資料。mysql_fetch_row函數的原型如下:MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);參數result就是mysql_store_result或mysql_use_result的傳回值。該函數返回MYSQL_ROW型的變數,即字串數組,假設為row,則row[i]為第i個欄位的值。當到結果集尾部時,此函數返回NULL。
(8)、結果集用完後,調用mysql_free_result函數釋放結果集,以防記憶體泄露。mysql_free_result函數的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result);
(9)、不再查詢Mysql資料庫時,調用mysql_close函數關閉資料庫連接。mysql_close函數的原型為:
void STDCALL mysql_close(MYSQL *sock);
4. MySQL C API編程例子:
#if defined(_WIN32) || defined(_WIN64) //為了支援windows平台上的編譯#include <windows.h>#endif#include <stdio.h>#include <stdlib.h>#include "mysql.h" //我的機器上該檔案在/usr/local/include/mysql下//定義資料庫操作的宏,也可以不定義留著後面直接寫進代碼#define SELECT_QUERY "select username from tbb_user where userid = %d"int main(int argc, char **argv) //char **argv 相當於 char *argv[]{ MYSQL mysql,*sock; //定義資料庫連接的控制代碼,它被用於幾乎所有的MySQL函數 MYSQL_RES *res; //查詢結果集,結構類型 MYSQL_FIELD *fd ; //包含欄位資訊的結構 MYSQL_ROW row ; //存放一行查詢結果的字串數組 char qbuf[160]; //存放查詢sql語句字串 if (argc != 2) { //檢查輸入參數 fprintf(stderr,"usage : mysql_select <userid>\n\n"); exit(1); } mysql_init(&mysql); if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) { fprintf(stderr,"Couldn‘t connect to engine!\n%s\n\n",mysql_error(&mysql)); perror(""); exit(1); } sprintf(qbuf,SELECT_QUERY,atoi(argv[1])); if(mysql_query(sock,qbuf)) { fprintf(stderr,"Query failed (%s)\n",mysql_error(sock)); exit(1); } if (!(res=mysql_store_result(sock))) { fprintf(stderr,"Couldn‘t get result from %s\n", mysql_error(sock)); exit(1); } printf("number of fields returned: %d\n",mysql_num_fields(res)); while (row = mysql_fetch_row(res)) { printf("Ther userid #%d ‘s username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ; puts( "query ok !\n" ) ; } mysql_free_result(res); mysql_close(sock); exit(0); return 0; //. 為了相容大部分的編譯器加入此行}
MySQL基礎及MySQL C API編程