Linux下C语言连接MySQL

    Linux 发行版本:RHEL 6.1

    Linux 内核版本: 2.6.32-131.0.15.el6.i686

    gcc 版本: 4.4.4 20100726

    MySQL版本:mysql-5.1.52-1.el6_0.1.i686mysql-devel-5.1.52-1.el6_0.1.i686,mysql-server-5.1.52-1.el6_0.1.i686

        全部是RHEL 6.1自带的rpm包,由于红帽的升级服务需要额外费用,所以一般人都将镜像当成更新源。另一方面,红帽发行的企业版是很稳定的,当然稳定的前提是使用配套的rpm包。

1.建立MySQL服务器

    #yum install mysql
    #yum install mysql-devel
    #yum install mysql-server

2.创建数据库

    #/etc/init.d/mysqld start				//启动MySQL服务器
    #mysqladmin –u root password YOUR.PASSWORD		//添加MySQL的root账号
    #mysql –u root –p					//以root身份登录数据库
    mysql>create database iSql;			//创建一个数据库,名叫“iSql”
    mysql>grant all privileges on iSql.* to jiutian@localhost identified by 'PASSWORD';
                       //为iSql创建一个数据库账户,名叫“jiutian”,最后的密码要用单引号括起来
    mysql>use iSql;				//切换到iSql数据库
    Database changed
    mysql>CREATE TABLE votelanguage(
        ->id INT NOT NULL AUTO_INCREMENT,
        ->choice TINYINT NOT NULL,
        ->ts TIMESTAMP,
        ->PRIMARY KEY(id);			//创建新表votelanguage(摘自MySQL 5 权威指南 第三版)
    Query OK, 0 rows affected(0.75 sec)		//创建成功
    mysql>describe votelanguage		//显示votelanguage表的结构

3.客户端编写程序

       C 程序源代码如下:

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

int main(int argc, char *argv[]){
    int i;
    MYSQL *conn;        //connection
    MYSQL_RES *result;  //result of SELECT query
    MYSQL_ROW row;      //a record of the SELECT query

    //create connection to MySQL
    conn = mysql_init(NULL);
    if (mysql_real_connect(conn, "localhost", "jiutian", "DATABASE.PASSWD", "iSql", 0, NULL, 0) == NULL){
        fprintf(stderr, "Sorry, no database connection ...\n");
        return 1;
    }

    //only if Unicode output(utf8) is desired
    mysql_query(conn, "SET NAMES 'utf8'");

    //create list of all
    const char *sql = "SELECT ts as 'time'\
                       FROM votelanguage\
                       WHERE choice = 1;";
    if (mysql_query(conn, sql)){
        fprintf(stderr, "%s\n\n", mysql_error(conn));
        fprintf(stderr, "%s\n", sql);
        return 1;
    }

    //process result
    result = mysql_store_result(conn);
    if (result == NULL){
        if (mysql_error(conn))
            fprintf(stderr, "%s\n", mysql_error(conn));
        else
            fprintf(stderr, "%s\n", "unknown error\n");
        return 1;
    }
    printf("%i records found \n", (int)mysql_num_rows(result));

    //loop over all records
    while ((row = mysql_fetch_row(result)) != NULL){
        for (i = 0; i < mysql_num_fields(result); i++){
            if (row[i] == NULL)
                printf ("[NULL]\t");
            else
                printf ("%s\n", row[i]);
        }
    }

    //release memory, server connection
    mysql_free_result(result);
    mysql_close(conn);

    return 0;
}

4.gcc编译

    gcc -o link -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
		//由于mysql的lib文件不在默认的库文件目录下,所以编译的时候要把-L加进去,include文件也是同理
		//不然的话,就会提示各种找不到的抓狂错误..
		//比如 /usr/bin/ld: cannot find -lmysqlclient 其实就是找不到mysql的某个库文件

        至于如果不加参数编译不通过的造成的原因,个人认为是mysql的rpm包默认配置路径的问题,在/usr/lib/mysql下有几个连接文件和连接的源文件在同一个目录下。所以如果不想每次编译的时候都将路径输入,就在gcc默认的lib位置加个连接就好了。


5.makefile文件

CC = gcc
INCLUDES = -I/usr/include/mysql
#link libmysqlclient functions dynamically
LIBS = -L/usr/lib/mysql -lmysqlclient
all:link

link_MySql.o: link_MySql.c
	$(CC) -c $(INCLUDES) link_MySql.c

link: link_MySql.o
	$(CC) -o link $(LIBS) link_MySql.o

clean:
	rm -f link *.o
        makefile文件中的每条命令前面用tab作为开始标记,不然是会报错的..

6.关于客户端Linux无法连接服务器MySQL的原因
        由于装的是RHEL6.1,所以很犀利的防火墙..只能在setup里添加MySQL的端口3306,protocol是tcp(会提示小写的)~

        PS:本文很多是手工输入,如果错误请提示,谢谢~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值