備忘録のため,内容の正当性については責任を持ちません。

CentOS 5.7 上で C から MySQL に接続する方法のメモ。


ライブラリのインストール

ヘッダファイルやライブラリが入っているか確かめる。

$ vi mysqltest.c
#include <stdio.h>
#include <mysql/mysql.h>

int main() {
    return 0;
}
$ gcc -o mysqltest mysqltest.c
mysqltest.c:3:25: error: mysql/mysql.h: そのようなファイルやディレクトリはありません

入っていないようなので,yum でインストールする。

# yum -y install mysql-devel

インストールされたか確認する。

$ ls /usr/include/mysql
decimal.h   my_config.h   my_pthread.h ...

ちゃんと入ったようだ。


接続

試しに MySQL サーバに接続してみる。

$ vi mysqltest.c
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>

#define DBHOST "localhost"
#define DBUSER "myuser"
#define DBPASS "mypass"
#define DBNAME "mydb"

int main() {
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;

    // 接続
    conn = mysql_init(NULL);
    if (!mysql_real_connect(conn, DBHOST, DBUSER, DBPASS, DBNAME, 3306, NULL, 0)) {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }

    // 切断
    mysql_close(conn);

    return 0;
}

コンパイルする。

$ gcc -o mysqltest mysqltest.c
/tmp/ccBEJwnl.o: In function `main':
mysqltest.c:(.text+0x19): undefined reference to `mysql_init'
mysqltest.c:(.text+0x5f): undefined reference to `mysql_real_connect'
mysqltest.c:(.text+0x6e): undefined reference to `mysql_error'
mysqltest.c:(.text+0x9f): undefined reference to `mysql_close'
collect2: ld はステータス 1 で終了しました

怒られた。ライブラリを指定して再度コンパイルする。

$ gcc -lmysqlclient -o mysqltest mysqltest.c
/usr/bin/ld: cannot find -lmysqlclient
collect2: ld はステータス 1 で終了しました

まだだめだった。ライブラリのパスも指定してコンパイルする。

$ gcc -L/usr/lib/mysql -lmysqlclient -o mysqltest mysqltest.c

今度はうまくいった。

SQL の実行

いよいよ実際に SQL を実行する。

#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>

#define DBHOST "localhost"
#define DBUSER "myuser"
#define DBPASS "mypass"
#define DBNAME "mydb"

int main() {
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;

    // 接続
    conn = mysql_init(NULL);
    if (!mysql_real_connect(conn, DBHOST, DBUSER, DBPASS, DBNAME, 3306, NULL, 0)) {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }

    // クエリ発行
    if (mysql_query(conn, "show tables")) {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }
    res = mysql_use_result(conn);

    // 結果表示
    while ((row = mysql_fetch_row(res)) != NULL) {
        printf("%s\n", row[0]);
    }
    mysql_free_result(res);

    // 切断
    mysql_close(conn);

    return 0;
}

コンパイルして実行してみる。

$ gcc -L/usr/lib/mysql -lmysqlclient -o mysqltest mysqltest.c
$ ./mysqltest
mytable1
mytable2
  :

無事結果が表示された。

参考ページ

コメント

コメント(1) “C で MySQL に接続する”

  1. じゅんぼ

    CentOSサーバー上で動かせる、管理ツールを作ろうとして
    参考にさせていただきました。

    大変わかりやすかったです。

    ありがとうございました!

    ブログにリンクさせてもらってもいいでしょうか?

コメントする




CAPTCHA