Linux下C操作Mysql入门

40E333CA-7F22-4173-937A-40F8CE67A3E9
今天走了一下C操作Mysql之路,方法和PHP操作Mysql的整个流程实在很像,所以也没有什么难点。
我的环境:
操作系统:Centos6.5
编译器:gcc 4.4.7
Mysql版本:5.1.73

准备工作:
要使用C操作Mysql,一定要有Mysql提供的API(如mysql.h),所以首先,需要做点准备工作,首先需要安装mysql-devel,终端下直接输入一下命令安装
yum install mysql-devel
如果是Ubuntu,则执行apt-get install mysql-devel
安装过程一般不会出大问题,除非你真的那么点背。。。

然后呢?准备出一张表来,我这里是新建了一名为test的数据库,并在test库下新建了一张user表,表的结构为:
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

好,让我们看看mysql.h安装到哪里了
终端中执行命令,查看mysql.h的路径

find / -name mysql.h

屏幕快照 2015-12-25 下午2.29.00

Linux下C标准库一般放在以下路径,也就是说gcc在编译的时候会从以下这几个路径中去找头文件

     /usr/local/include
     libdir/gcc/target/version/include
     /usr/target/include
     /usr/include

详细信息点击这里:https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

所以我在程序中引入mysql.h的时候,就要注意路径是否正确,你也要根据自己的情况来引入

#include <mysql/mysql.h>

新建一个mysql.c的文件,下面我们所有的代码都将在这一个文件中,好,动手去做吧!!

让C和Mysql握手

#include <stdio.h>
#include <mysql/mysql.h>
int main()
{
    //新建一个MYSQL变量
    MYSQL mysql;
    //初始化mysql句柄
    mysql_init(&mysql);
    if(!mysql_real_connect(&mysql, "localhost", "root", "123456", “test", 0, NULL, 0)) {
        printf("Can't Connect Mysql Server!\n");
    }else{
        printf("Connect Mysql Server Successed!\n");
    }
    mysql_close(&mysql);
    return 0;
}

好,我知道你现在肯定很着急,想去编译代码,如果直接gcc你就输了,正确的编译命令是这样的

gcc mysql.c -o mysql -L/usr/lib64/mysql -lmysqlclient

1.为什么要这么编译?
因为直接编译的话,会报出gcc无法找到连接器的错误,所以我么在后面通过加-L -l等参数来动态链接需要的链接器,才会编译成功。
2.什么是mysql句柄?
答:句柄的概念其实在其他系统编程中经常遇到,实际上句柄可以理解为一把钥匙。在我们这里,如果C拿到了这把钥匙,但还是不能很幸运的进Mysql的家?
3.为什么不能进入Mysql的家?
答:Mysql是一个非常小心的家伙,当mysql_real_connect作为一个信使去Mysql的家门口时,做了一系列类似于指纹的验证啊,脸部的验证啊之类的,如果它很幸运的都验证成功了的话,那么Mysql会给C的钥匙做一次升级,这样以后就不需要那么繁琐的验指纹验脸之类的杂活儿了,只要C拿到了钥匙就可以直接进入Mysql的家门。

让我们在Mysql家里一探究竟

#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
    //定义变量
    MYSQL mysql;
    MYSQL_RES *res;
    MYSQL_ROW row;
    char *query;
    int filed_key;
    //初始化Mysql句柄
    mysql_init(&mysql);
    //连接mysql
    if(!mysql_real_connect(&mysql, "localhost", "root", "123456", "test", 0, NULL, 0)) {
        printf("Can't Connect Mysql Server!\n");
    }else{
        printf("Connect Mysql Server Successed!\n");
    }
    //新增一条数据
    query = "INSERT INTO user(name) VALUES('c')";
    if(mysql_real_query(&mysql, query, (unsigned int)strlen(query));) {  
        printf("Query Failed!\n");
        return 0;  
    }else {  
        printf("Query Successed\n");  
    }
    //从句柄中读取结果
    res = mysql_store_result(&mysql);  
    //循环读取结果
    while(row = mysql_fetch_row(res)) {  
        //mysql_num_fields计算一行结果集中的字段数量
        for(filed_key=0; filed_key<mysql_num_fields(res); filed_key++){
            printf("%s\t", row[filed_key]);  
        }  
        printf("\n");  
    }  
    //关闭连接
    mysql_close(&mysql);
    return 0;
}

编译并查看结果:
A04F9808-6BAB-430F-BB3A-418896BCAF5D

而对于改 和 删 数据,这里就不再赘述,很简单,只需要更改query字符串即可,这个任务就留给读者。

Linux下C操作Mysql入门
Tags:     

发表评论

电子邮件地址不会被公开。 必填项已用*标注