MySQL基礎及MySQL C API編程

來源:互聯網
上載者:User

標籤:

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基礎文法:

  • 1.建立資料庫,名字為RUNOOB

mysqladmin -u root -p create RUNOOB

  • 2.刪除資料庫,名字為RUNOOB

mysqladmin -u root -p drop RUNOOB

  • 3.顯示資料庫:

mysql> show databases; //注意後面要加;號,表示一條mysql語句結束

  • 4.選擇資料庫:

mysql> use RUNOOB;

  • 5.資料類型:

http://www.runoob.com/mysql/mysql-data-types.html

  • 6.顯示當前資料庫下的資料表:

mysql> show tables;

  • 7.建立資料表:
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 )    -> );
  • 8.刪除資料表:

mysql> DROP TABLE runoob_tbl

  • 9.插入資料:
mysql> INSERT INTO runoob_tbl     ->(runoob_title, runoob_author, submission_date)    ->VALUES    ->("Learn PHP", "John Poul", NOW());
  • 10.查詢資料表中的資料:

SELECT * from runoob_tbl

  • 11.Show有關的文法:
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; //列出使用者的授權命令
  • 12.where子句:

mysql> SELECT * from runoob_tbl WHERE runoob_author=‘Sanjay‘; //查詢某一個合格表項

  • 13.update查詢:
//查詢並修改表中的一項,最後更新表格mysql> UPDATE runoob_tbl     -> SET runoob_title=‘Learning JAVA‘     -> WHERE runoob_id=3;
  • 14.delete語句:

mysql> DELETE FROM runoob_tbl WHERE runoob_id=3; //刪除表中的某一項

  • 15.ALTER命令:
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; //修改表名
  • 16.Regex:

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編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.