ubuntu15.04 C客戶端操作mysql

                     ubuntu15.04 C客戶端操作mysql

    最近,又在ubuntu上面搭建mysql環境,使用C語言接口對mysql數據庫進行操作。安裝mysql時分別用了命令行安裝、源代碼編譯安裝兩種方法,在源碼安裝的時候出現了一點小插曲,mysql-5.7版本make的時候耗時非常長,在40%進度一直沒有反應,無奈重新下載使用mysql5.6版本重新編譯完成。大概是版本沒有完全支持的原因,ubuntu15.04命令行安裝mysql默認版本也是5.6。

1、安裝mysql

   命令行方式與源代碼編譯方式

   1.1命令行方式安裝mysql

      第一步檢查是否安裝mysql,命令行輸入:

        liang@ubuntu:~$ mysql

      打印如下輸出,即系統中沒有安裝mysql
    
      The program 'mysql' can be found in the following packages:
      * mysql-client-core-5.6
      * mariadb-client-core-10.0
      Try: sudo apt-get install <selected package>


      第二步安裝mysql-client、mysql-server
      首先,更新app安裝源,命令行輸入:
        liang@ubuntu:~$ sudo apt-get update
      然後,安裝mysql,命令行輸入:
   liang@ubuntu:~$ sudo apt-get install mysql-client mysql-server

      提示確認安裝,輸入y回車往下安裝;界面安裝會彈窗提示輸入mysql的root密碼,非界面安裝root密碼爲空;安裝結束後,命令行輸入:
    liang@ubuntu:~$ mysql -V
      打印如下信息即安裝成功:
    mysql  Ver 14.14 Distrib 5.6.27, for debian-linux-gnu (x86_64) using  EditLine wrapper
       最後,安裝C語言連接mysql需要的API庫,命令行輸入
    liang@ubuntu:~$ sudo apt-get install libmysqlclient18 libmysqlclient-dev

   

     1.2源代碼編譯安裝mysql

       編譯源代碼需要安裝gcc,命令行輸入:
    sudo apt-get install build-essential
       下載最新版本的mysql源碼包,命令行輸入:
    liang@ubuntu:~/mysql$ wget http://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.28.tar.gz
       解壓源碼包,命令行輸入:
    liang@ubuntu:~/mysql$ tar zxvf mysql-5.6.28e.tar.gz
    liang@ubuntu:~/mysql$ cd mysql-5.6.28
       安裝其他依賴包,命令行輸入:
    liang@ubuntu:~/mysql/mysql-5.6.28$ sudo apt-get install cmake m4 bison libncurses5-dev libmysqlclient×
        開始源碼編譯安裝mysql,命令行輸入:
    liang@ubuntu:~/mysql/mysql-5.6.28$ sudo cmake .
       打印如下錯誤信息,提示安裝boost庫:
 
      CMake Error at cmake/boost.cmake:76 (MESSAGE):
      You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>


      This CMake script will look for boost in <directory>.  If it is not there,
      it will download and unpack it (in that directory) for you.


      If you are inside a firewall, you may need to use an http proxy:


      export http_proxy=http://example.com:80


      Call Stack (most recent call first):
      cmake/boost.cmake:228 (COULD_NOT_FIND_BOOST)
      CMakeLists.txt:435 (INCLUDE)




      -- Configuring incomplete, errors occurred!
      See also "/home/liang/mysql/mysql-5.6.28/CMakeFiles/CMakeOutput.log".

      下載boost源碼包,命令行輸入:
<pre name="code" class="plain">   liang@ubuntu:~/mysql/mysql-5.6.28$ cd ..
   liang@ubuntu:~/mysql$ wget http://downloads.sourceforge.net/boost/boost_1_59_0.tar.bz2
      解壓boost源碼包,命令行輸入:   
    liang@ubuntu:~/mysql$ tar xvf boost_1_59_0.tar.bz2
      進入boost目錄,命令行輸入:
     liang@ubuntu:~/mysql$ cd boost_1_59_0/
       安裝boost,命令行輸入:
    liang@ubuntu:~/mysql/boost_1_59_0$ sudo ./bootstrap.sh
    liang@ubuntu:~/mysql/boost_1_59_0$ sudo ./b2 install
       執行的時間比較長,耐心等候。。。。。。。。。

       安裝完畢,檢查boost是否安裝成功:
     liang@ubuntu:~/mysql/boost_1_59_0$ ls /usr/local/include/
       打印輸出存在boost目錄,即安裝成功。
      boost         dnet.h       pcap-namedb.h  pcre.h              sfbpf.h

      重新去安裝mysql,命令行輸入:
     liang@ubuntu:~/mysql/mysql-5.6.28$ sudo cmake .
     liang@ubuntu:~/mysql/mysql-5.6.28$ sudo make && sudo make install

     執行的時間比較長,耐心等候。。。。。。。。。

  

     安裝完成後,初始化mysql數據庫,命令行輸入:

   liang@ubuntu:~/mysql/mysql-5.6.28$ cd /usr/local/mysql/scripts/
   liang@ubuntu:/usr/local/mysql/scripts$ sudo ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data &


     初始化成功後啓動mysql服務,命令行輸入:

       liang@ubuntu:/usr/local/mysql/scripts$ cd ../bin/

   liang@ubuntu:/usr/local/mysql/bin$ sudo ./mysqld -uroot


     啓動成功,打印如下信息:
2015-12-18 11:32:27 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-12-18 11:32:27 0 [Note] ./mysqld (mysqld 5.6.28) starting as process 6106 ...
2015-12-18 11:32:27 6106 [Note] Plugin 'FEDERATED' is disabled.
2015-12-18 11:32:27 6106 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-12-18 11:32:27 6106 [Note] InnoDB: The InnoDB memory heap is disabled
2015-12-18 11:32:27 6106 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-12-18 11:32:27 6106 [Note] InnoDB: Memory barrier is not used
2015-12-18 11:32:27 6106 [Note] InnoDB: Compressed tables use zlib 1.2.3
2015-12-18 11:32:27 6106 [Note] InnoDB: Using CPU crc32 instructions
2015-12-18 11:32:27 6106 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-12-18 11:32:27 6106 [Note] InnoDB: Completed initialization of buffer pool
2015-12-18 11:32:27 6106 [Note] InnoDB: Highest supported file format is Barracuda.
2015-12-18 11:32:27 6106 [Note] InnoDB: 128 rollback segment(s) are active.
2015-12-18 11:32:27 6106 [Note] InnoDB: Waiting for purge to start
2015-12-18 11:32:27 6106 [Note] InnoDB: 5.6.28 started; log sequence number 1625997
2015-12-18 11:32:27 6106 [Note] Server hostname (bind-address): '*'; port: 3306
2015-12-18 11:32:27 6106 [Note] IPv6 is available.
2015-12-18 11:32:27 6106 [Note]   - '::' resolves to '::';
2015-12-18 11:32:27 6106 [Note] Server socket created on IP: '::'.
2015-12-18 11:32:28 6106 [Note] Event Scheduler: Loaded 0 events
2015-12-18 11:32:28 6106 [Note] ./mysqld: ready for connections.
Version: '5.6.28'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution
      

     打開另外一個命令行,連接mysql:

      liang@ubuntu:~$ cd /usr/local/mysql/bin/

   liang@ubuntu:/usr/local/mysql/bin$ ./mysql -uroot

     連接成功,打印如下信息: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.28 Source distribution


Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> 

    這裏沒有完成的工作:沒有把mysql的命令添加到系統服務中去,每一次都要進入mysql的命令程序目錄啓動數據庫。 
 
2、mysql數據庫的簡單操作
        連接到mysql服務,命令行輸入:     
      liang@ubuntu:~$ mysql -uroot -p
        回車,輸入mysql的root密碼,密碼爲空直接確認,進入mysql命令行;
  
   Enter password: 
   Welcome to the MySQL monitor.  Commands end with ; or \g.
   Your MySQL connection id is 5
   Server version: 5.6.27-0ubuntu1 (Ubuntu)


   Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.


   Oracle is a registered trademark of Oracle Corporation and/or its
   affiliates. Other names may be trademarks of their respective
   owners.


   Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


   mysql> 


   
   2.1查詢、創建數據庫
      查詢數據庫,命令行輸入:
     mysql> show databases;
      打印輸出如下,系統默認創建三個數據庫:
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      +--------------------+
      3 rows in set (0.00 sec)
 
      創建新的數據庫,命令行輸入:
    mysql> create database joy;
      打印輸出如下,創建數據庫成功:
    Query OK, 1 row affected (0.00 sec)
      重新查詢數據庫,會存在新建數據庫 joy
    mysql> show databases;
     結果如下,存在四個數據庫,包括 joy
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | joy                |
      | mysql              |
      | performance_schema |
      +--------------------+
      4 rows in set (0.00 sec)

   2.2查詢、創建數據表
        使用一個數據庫,命令行輸入:
      mysql> use joy;
        出現如下結果,進入 就哦也數據庫成功:
      Database changed
       列出數據庫中的全部表,命令行輸入:
      mysql> show tables;
      現在 joy 是一個新建的數據庫,不存在數據表:
      Empty set (0.00 sec)
      創建一個session數據表,命令行輸入:
      mysql> CREATE TABLE IF NOT EXISTS `session` (
       `id` int(10) unsigned NOT NULL,
       `uid` int(10) unsigned NOT NULL,
       `sig` varchar(32) NOT NULL,
       `expired` int(10) unsigned NOT NULL
        ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
     打印如下結果創建成功:
      Query OK, 0 rows affected (0.19 sec)

      再次列出數據庫中的全部表,命令行輸入:
       mysql> show tables;
      打印如下結果,看到session數據表:
      +---------------+
      | Tables_in_joy |
      +---------------+
      | session       |
      +---------------+
      1 row in set (0.00 sec)
 
      驗證session數據表的元素,命令行輸入:
      mysql> desc session;
      打印如下結果:
      +---------+------------------+------+-----+---------+-------+
      | Field   | Type             | Null | Key | Default | Extra |
      +---------+------------------+------+-----+---------+-------+
      | id      | int(10) unsigned | NO   |     | NULL    |       |
      | uid     | int(10) unsigned | NO   |     | NULL    |       |
      | sig     | varchar(32)      | NO   |     | NULL    |       |
      | expired | int(10) unsigned | NO   |     | NULL    |       |
      +---------+------------------+------+-----+---------+-------+
      4 rows in set (0.04 sec)

   2.3數據的增刪查改
      對session表進行增上查改,插入一行新的數據,命令行輸入:
    mysql> INSERT INTO `session` (`id`, `uid`, `sig`, `expired`) VALUES(1, 1, '8460abc97bbd11e5acaf000c29c494bc', 1448440960);
      打印如下結果插入數據成功成功:
    Query OK, 1 row affected (0.06 sec)
      查詢session數據表的數據,命令行輸入:
    mysql> select * from session;
      打印如下結果,可以看到上一個插入的數據:
      +----+-----+----------------------------------+------------+
      | id | uid | sig                              | expired    |
      +----+-----+----------------------------------+------------+
      |  1 |   1 | 8460abc97bbd11e5acaf000c29c494bc | 1448440960 |
      +----+-----+----------------------------------+------------+
      1 row in set (0.00 sec)
      修改session數據表中的數據,修改id=1上的數據項sig的值爲“0000000000000000000000000”,命令行輸入:
      mysql> update session set sig = "0000000000000000000000000" where id = "1"; 

      打印如下結果即修改數據項成功:

           Query OK, 1 row affected (0.04 sec)

     Rows matched: 1  Changed: 1  Warnings: 0

        再次查詢session數據表,命令行輸入:    
     mysql> select * from session;
        id=1上的數據項sig的值已經發生改變: 
      +----+-----+---------------------------+------------+
      | id | uid | sig                       | expired    |
      +----+-----+---------------------------+------------+
      |  1 |   1 | 0000000000000000000000000 | 1448440960 |
      +----+-----+---------------------------+------------+
      1 row in set (0.00 sec)
 
        刪除session數據表中的數據,刪除id=1的一行數據,命令行輸入:
    mysql> delete from session where id=1;
       出現如下結果,刪除成功:
      Query OK, 1 row affected (0.07 sec)
        再次查詢session數據表,命令行輸入:
     mysql> select * from session;
       session表中的數據已經被刪除:
      Empty set (0.00 sec)


3、C語言操作mysql

          需要安裝libmysql客戶端支持,命令行輸入:

     liang@ubuntu:~/workspace/mysql$ sudo apt-get install libmysqlclient*

     3.1連接數據庫

         連接mysql的API函數,包括:MYSQL操作對象、連接主機、用戶(MYSQL)、密碼、數據庫名、端口等等,結果返回0即成功,其他爲連接失敗</span>

          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);

3.2數據的增刪查改

int  STDCALL  mysql_query(MYSQL *mysql, const char *q);

        數據庫操作API,使用該函數對mysql執行sql語句,包括了創建數據庫、創建表、增刪查改等等。參數:一個數據庫操作對象、sql執行語句

    
   3.3操作實例

   下面的例子,第一次連接數據庫後創建test數據庫,第二次連接數據庫連接到test數據庫,並且創建joy數據表,插入兩條數據到joy,然後遍歷查詢joy中的數據。

   使用gcc編譯:

    liang@ubuntu:~/workspace/mysql$ gcc -g -o test -I/usr/include/mysql MysqlTest.c -L/usr/lib/mysql -lmysqlclient -lz       
   生成test可執行文件:(前提是test數據庫不存在)
    liang@ubuntu:~/workspace/mysql$ ./test 
   查看結果:
liang@ubuntu:~/workspace/mysql$ ./test 
select data success
1         1         8460abc97bbd11e5acaf000c29c494bc  1448440960  
2         1         2a6e0d7f810911e5a8b2000c29c494bc  1449023207  
   mysql客戶端查看:
mysql> select * from session;
+----+-----+----------------------------------+------------+
| id | uid | sig                              | expired    |
+----+-----+----------------------------------+------------+
|  1 |   1 | 8460abc97bbd11e5acaf000c29c494bc | 1448440960 |
|  2 |   1 | 2a6e0d7f810911e5a8b2000c29c494bc | 1449023207 |
+----+-----+----------------------------------+------------+
2 rows in set (0.00 sec)

源代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

#define mysqlhost "127.0.0.1"
#define mysqluser "root" 
#define mysqlpwd  ""
#define dbname    "test"
  

int main(int argc, char **argv)
{
	MYSQL *conn,*conn1;
	MYSQL_RES *mysqlresult;
        MYSQL_ROW mysqlrow;

    int x, y, numrow, numcol,result;
	char sql_create_table[300]="CREATE TABLE IF NOT EXISTS session (id int(10) unsigned NOT NULL,uid int(10) unsigned NOT NULL,sig varchar(32) NOT NULL,expired int(10) unsigned NOT NULL)ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;";
	char sql_insert_data[300]="INSERT INTO `session` (`id`, `uid`, `sig`, `expired`) VALUES(1, 1, '8460abc97bbd11e5acaf000c29c494bc', 1448440960),(2, 1, '2a6e0d7f810911e5a8b2000c29c494bc', 1449023207)";
	char sql_select_data[300]="select * from session";
	
	if( (conn = mysql_init(NULL))== NULL){
        printf("mysql_init failed! exiting...\n");
        return 1;
    }
	
		if( (conn1 = mysql_init(NULL))== NULL){
        printf("mysql_init failed! exiting...\n");
        return 1;
    }
	
	if (mysql_real_connect(conn1, mysqlhost, mysqluser, mysqlpwd, NULL, 0, NULL, 0) == NULL) {
      printf("mysql_real_connect error %u: %s\n", mysql_errno(conn1), mysql_error(conn1));
    return 1;  
    }
	
	if (mysql_query(conn1, "create database test")) {  //創建test數據庫
      printf("mysql_query create database error %u: %s\n", mysql_errno(conn1), mysql_error(conn1));
     return 1; 
    }
	else{
	  printf("create databae success\n");
	  mysql_close(conn1); 
	}

	
    if (mysql_real_connect(conn, mysqlhost, mysqluser, mysqlpwd, dbname, 0, NULL, 0) == NULL) {
      printf("mysql_real_connect error %u: %s\n", mysql_errno(conn), mysql_error(conn));
      return 1;
    }
	
	if (mysql_query(conn,sql_create_table)) {  //創建session表
      printf("mysql_query create table error %u: %s\n", mysql_errno(conn), mysql_error(conn));
     return 1; 
    }
	else{
	  printf("create database success\n");
	}
	
	if (mysql_query(conn,sql_insert_data)) {  //插入數據
      printf("mysql_query insert data error %u: %s\n", mysql_errno(conn), mysql_error(conn));
     return 1; 
    }
	else{
	  printf("insert data success\n");
	}


result = mysql_query(conn,"select * from test.session");
	if (result) {  //查詢數據
      printf("mysql_query select data error %u: %s\n", mysql_errno(conn), mysql_error(conn));
    return 1;  
    }
	else{
	    printf("select data success\n");
	    mysqlresult = mysql_store_result(conn);
               if(mysqlresult){
                numrow = mysql_num_rows(mysqlresult);
                numcol = mysql_num_fields(mysqlresult);
                for(x=0; x<numrow; x++)
                {
                  mysqlrow = mysql_fetch_row(mysqlresult);
                  for(y=0; y<numcol; y++)
                  {
                     printf("%-8s  ",mysqlrow[y]);
                  }
                  printf("\n");
                }
               }
	}
        mysql_free_result(mysqlresult);
	mysql_close(conn);
  return 0;
}
4、其他補充
   4.1gcc編譯環境

      命令行輸入,安裝完成即可:

        sudo apt-get install build-essential



   
   
   
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章