ubuntu15.04 Cクライアント操作mysql


ubuntu15.04 Cクライアント操作mysql
最近、ubuntu上にmysql環境を構築し、C言語インタフェースを使用してmysqlデータベースを操作しています.mysqlをインストールする时それぞれコマンドラインのインストール、ソースコードのコンパイルのインストールの2つの方法を使って、ソースコードのインストールの时に1时(点)のエピソードが现れて、mysql-5.7バージョンmakeの时とても长い时间を费やして、40%の进度でずっと反応していないで、仕方なく再びmysql 5をダウンロードして使います6バージョンの再コンパイルが完了しました.おそらくバージョンが完全にサポートされていない理由ですubuntu 15.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>

ステップ2 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;
印刷出力は次のとおりです.システムはデフォルトで3つのデータベースを作成します.
      +--------------------+
      | 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を含む4つのデータベースが存在します.
      +--------------------+
      | 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データの追加削除
セッションテーブルを追加して変更し、新しいデータを挿入し、コマンドラインに入力します.
    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の値を「0000000000000000000000」に変更し、コマンドラインに入力します.
      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)
 
セッションデータテーブルのデータを削除し、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操作例
次の例では、1回目のデータベース接続後にtestデータベースを作成し、2回目のデータベース接続後にtestデータベースに接続し、joyデータテーブルを作成し、2つのデータを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...
"); return 1; } if( (conn1 = mysql_init(NULL))== NULL){ printf("mysql_init failed! exiting...
"); return 1; } if (mysql_real_connect(conn1, mysqlhost, mysqluser, mysqlpwd, NULL, 0, NULL, 0) == NULL) { printf("mysql_real_connect error %u: %s
", mysql_errno(conn1), mysql_error(conn1)); return 1; } if (mysql_query(conn1, "create database test")) { // test printf("mysql_query create database error %u: %s
", mysql_errno(conn1), mysql_error(conn1)); return 1; } else{ printf("create databae success
"); mysql_close(conn1); } if (mysql_real_connect(conn, mysqlhost, mysqluser, mysqlpwd, dbname, 0, NULL, 0) == NULL) { printf("mysql_real_connect error %u: %s
", mysql_errno(conn), mysql_error(conn)); return 1; } if (mysql_query(conn,sql_create_table)) { // session printf("mysql_query create table error %u: %s
", mysql_errno(conn), mysql_error(conn)); return 1; } else{ printf("create database success
"); } if (mysql_query(conn,sql_insert_data)) { // printf("mysql_query insert data error %u: %s
", mysql_errno(conn), mysql_error(conn)); return 1; } else{ printf("insert data success
"); } result = mysql_query(conn,"select * from test.session"); if (result) { // printf("mysql_query select data error %u: %s
", mysql_errno(conn), mysql_error(conn)); return 1; } else{ printf("select data success
"); 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("
"); } } } mysql_free_result(mysqlresult); mysql_close(conn); return 0; }

4、その他補充
   
4.1 gccコンパイル環境
コマンドライン入力、インストール完了:
        sudo apt-get install build-essential