今天走了一下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
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;
}
而对于改 和 删 数据,这里就不再赘述,很简单,只需要更改query字符串即可,这个任务就留给读者。