1 C语言连接mysql简介
C代码的API是随MySQL一起发布的. 它包含在mysqlclient库中, 可以使C程序来访问数据库.
MySQL源码包中的许多客户端都是用C写的. 如果你正在找使用这些C API的例子, 可以看看客户端的写法.你可以在MySQL源码包的clients目录找到这些例子.
2 测试环境
操作系统:Red Hat Enterprise Linux Server release 6.4
mysql版本:mysql-5.5.28
3 编程实例
- #include <stdio.h>
- #include "/usr/local/mysql/include/mysql.h"
- void printResult(MYSQL *mysql);
- int main()
- {
- MYSQL mysql;
- MYSQL_RES * result;
- mysql_init(&mysql);
- mysql_real_connect(&mysql, "127.0.0.1", "root", "jesse", NULL, 3355, NULL, 0);
- mysql_query(&mysql, "set names 'utf8'");
- mysql_query(&mysql, "drop database if exists tmpdb");
- mysql_query(&mysql, "create database tmpdb");
- mysql_query(&mysql, "use tmpdb");
- mysql_query(&mysql, "create table tmptab(c1 int, c2 varchar(20), c3 varchar(20))");
- mysql_query(&mysql, "insert into tmptab values(101, '姓名1', 'address1'), (102, '姓名2', 'address2'), (103, '姓名3', 'address3')");
- mysql_query(&mysql, "select * from tmptab");
- printf("--增加数据测试--\n");
- printResult(&mysql);
- mysql_query(&mysql, "delete from tmptab where c1 = 101");
- mysql_query(&mysql, "select * from tmptab");
- printf("--删除数据测试--\n");
- printResult(&mysql);
- mysql_query(&mysql, "update tmptab set c3 = 'address4' where c1 = 103");
- mysql_query(&mysql, "select * from tmptab");
- printf("--更新数据测试--\n");
- printResult(&mysql);
- mysql_query(&mysql, "delete from tmptab");
- mysql_query(&mysql, "select * from tmptab");
- printf("--清空数据测试--\n");
- printResult(&mysql);
- mysql_query(&mysql, "drop table tmptab");
- mysql_query(&mysql, "drop database tmpdb");
- mysql_close(&mysql);
- }
- void printResult(MYSQL *mysqlPrint)
- {
- MYSQL_RES * result;
- int numFields = 0;
- int numRows = 0;
- MYSQL_FIELD * field;
- MYSQL_ROW row;
- int i = 0;
- result = mysql_store_result(mysqlPrint);
- numFields = mysql_num_fields(result);
- numRows = mysql_num_rows(result);
- while(field = mysql_fetch_field(result))
- printf("%s\t", field->name);
- printf("\n");
- if(result)
- {
- while(row = mysql_fetch_row(result))
- {
- for(i = 0; i < numFields; i++)
- {
- printf("%s\t", row[i]);
- }
- printf("\n");
- }
- }
- mysql_free_result(result);
- }
4 编译与运行
4.1 获取编译依赖信息
- [root@localhost /]# mysql_config --cflags
- -I/usr/local/mysql/include -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1
- [root@localhost /]# mysql_config --libs
- -L/usr/local/mysql/lib -lmysqlclient -lpthread -lm -lrt -ldl
mysql_config --cflags 编译器标志,用于查找包含文件,以及编译libmysqlclient库时所要使用的关键编译器标志和定义。
mysql_config --libs 与MySQL客户端库进行链接所需的库和选项。
4.2 编译源文件
- [root@localhost /]# gcc -o MysqlCTest MysqlCTest.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient
4.3 执行编译好的文件
- [root@localhost /]# ./MysqlCTest
- --增加数据测试--
- c1 c2 c3
- 101 姓名1 address1
- 102 姓名2 address2
- 103 姓名3 address3
- --删除数据测试--
- c1 c2 c3
- 102 姓名2 address2
- 103 姓名3 address3
- --更新数据测试--
- c1 c2 c3
- 102 姓名2 address2
- 103 姓名3 address4
- --清空数据测试--
- c1 c2 c3
5 补充知识
5.1 避免中文乱码
为确保程序写入数据库以及从数据库读出时不出现乱码,需要做如下配置:
c客户端程序级别:
c程序文件设置编码 utf8,如
- mysql_query(&mysql, "set names 'utf8'");
mysql数据库级别:
设置MySQL数据库客户端及服务端配置为utf8
例如:
在my.cnf配置文件中配置
- [mysql]
- default_character_set=utf8
- [mysqld]
- character-set-server=utf8
- collation-server=utf8_bin