mysql与c语言编程基础教程

(一)关于本教程

这是一本关于myql的c语言编程的入门教程,它讲述了mysql的c api编程的基本知识。本博文由编程导航网提供。

(二)关于mysql数据库

mysql是一个领先的开源数据管理系统,是一个多用户、多线程的数据库系统。mysql在web应用中特别流行,是非常流行的lamp(l-linux, a-apache, m-mysql, p-php)平台中的一部分。mysql最早是由瑞典的mysql ab公司所开发, 这家公司以及trolltech 是非常有名的开放源代码公司。mysql兼容大多数操作系统平台,包括bsd unix、linux、windows以及mac。维基百科和youtube使用mysql,这些网站每天处理上百万的查询请求。mysql包括两个版本:mysql服务端版本和mysql嵌入式版本。

(三)第一个示例

第一个示例简单的测试mysql的api函数,

#include #include int main(int argc, char **argv) { printf("mysql client version: %s\n", mysql_get_client_info()); return ; }

api mysql_get_client_info获取mysql客户端的版本号,编译:

gcc version.c -o version `mysql_config --cflags --libs

执行程序verion,得出如下输出结果:

$ ./version

mysql client version: 5.0.38

代码详解:

#include

#include

首先,我们包含必要的头文件myql.h和my_global.h,mysql.h是mysql函数调用中要包含的最重要的头文件。my_global.h包含了一些全局函数的声明以及标准输入输出的头文件。

printf("mysql client version: %s\n", mysql_get_client_info());

这些代码打印了mysql客户端的版本号,通过使用mysql_get_client_info api调用。

(四)创建数据库

以下代码演示如何创建数据库:

#include #include int main(int argc, char **argv) { mysql *conn; conn = mysql_init(null); if (conn == null) { printf("error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(); } if (mysql_real_connect(conn, "localhost", "zetcode", "passwd", null, , null, ) == null) { printf("error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(); } if (mysql_query(conn, "create database testdb")) { printf("error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(); } mysql_close(conn); }

以上示例代码先连接到mysql数据库,然后创建一个testdb数据库。现在登录到数据库中验证一下:

mysql> show databases;

+--------------------+

| database |

+--------------------+

| information_schema |

| mysql |

| testdb |

+--------------------+

3 rows in set (0.00 sec)

经验证,数据库testdb确实已经创建好了。

在这个示例代码中,我们进行了错误检查,进行错误检查是非常重要的,因为数据库编程中有许多地方会出现错误。为了简明起见,后面的示例将忽略错误检查。

本示例代码可以划分为以下几个部分:

1.初始化一个链接结构。

2.创建一个链接。

3.执行查询。

4.关闭链接。

mysql* conn;

首先,声明一个conn指针指向一个mysql结构体,这个结构体就是一个数据库连接句柄。

conn = mysql_init(null);

函数mysql_init将返回一个链接句柄。

if (conn == null) {

printf("error %u: %s\n", mysql_errno(conn), mysql_error(conn));

exit(1);

}

我们检查函数返回值,如果mysql_init函数执行失败,我们打印错误信息并且结束程序。

if (mysql_real_connect(conn, "localhost", "zetcode",

"passwd", null, 0, null, 0) == null) {

printf("error %u: %s\n", mysql_errno(conn), mysql_error(conn));

exit(1);

}

函数mysql_real_connect建立一个到mysql数据库的链接。调用这个函数要提供 链接句柄、主机名、用户、密码等参数,最后四个参数依次是数据库名、端口、unix套接字和客户端标志。

if (mysql_query(conn, "create database testdb")) {

printf("error %u: %s\n", mysql_errno(conn), mysql_error(conn));

exit(1);

}

mysql_close(conn);

函数mysql_query执行sql语句,在本示例中,将建立一个新的数据库。最后,我们关闭数据库链接。

(五)创建表并且插入数据

本示例将创建一个表并且插入一些数据,示例

#include #include int main(int argc, char **argv) { mysql *conn; conn = mysql_init(null); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", , null, ); mysql_query(conn, "create table writers(name varchar(25))"); mysql_query(conn, "insert into writers values('leo tolstoy')"); mysql_query(conn, "insert into writers values('jack london')"); mysql_query(conn, "insert into writers values('honore de balzac')"); mysql_query(conn, "insert into writers values('lion feuchtwanger')"); mysql_query(conn, "insert into writers values('emile zola')"); mysql_close(conn); }

在本示例代码中,我们没有使用任何新的mysql api,创建表和插入数据都是使用mysql_query函数。

1.建立链接

mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, null, 0);

2.建立writers表,该表只有一列,类型为varchar。

mysql_query(conn, "create table writers(name varchar(25))");

3.插入数据

mysql_query(conn, "insert into writers values('leo tolstoy')");

mysql_query(conn, "insert into writers values('jack london')");

mysql_query(conn, "insert into writers values('honore de balzac')");

mysql_query(conn, "insert into writers values('lion feuchtwanger')");

mysql_query(conn, "insert into writers values('emile zola')");

4.验证数据

mysql> select * from writers;

+-------------------+

| name |

+-------------------+

| leo tolstoy |

| jack london |

| honore de balzac |

| lion feuchtwanger |

| emile zola |

+-------------------+

5 rows in set (0.00 sec)

5.关闭链接

mysql_close(conn);

(六)从数据库中查询数据

这一节,我们从表中查询数据,分为以下几步:

1.建立一个链接

2.执行查询

3.获取结果集

4.获取所有行

5.释放结果集

6.释放链接

本节示例

#include #include int main(int argc, char **argv) { mysql *conn; mysql_res *result; mysql_row row; int num_fields; int i; conn = mysql_init(null); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", , null, ); mysql_query(conn, "select * from writers"); result = mysql_store_result(conn); num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { for(i = ; i < num_fields; i++) { printf("%s ", row[i] ? row[i] : "null"); } printf("\n"); } mysql_free_result(result); mysql_close(conn); }

1.执行查询,并取回writers表中的所有数据:

mysql_query(conn, "select * from writers");

2.获取结果集

result = mysql_store_result(conn);

3.获取writers表中的所有字段

num_fields = mysql_num_fields(result);

4.获取每行数据,并且输出到屏幕上

while ((row = mysql_fetch_row(result)))

{

for(i = 0; i < num_fields; i++)

{

printf("%s ", row[i] ? row[i] : "null");

}

printf("\n");

}

5.释放结果集

mysql_free_result(result);

6.关闭链接

mysql_close(conn);

(七)列头

在本节中,将演示查询数据并获取表中每一列的名字。

首先,我们建立一个新的表,并插入些数据:

mysql> create table friends (id int not null primary key auto_increment,

name varchar(20), age int);

mysql> insert into friends(name, age) values('tom', 25);

mysql> insert into friends(name, age) values('elisabeth', 32);

mysql> insert into friends(name, age) values('jane', 22);

mysql> insert into friends(name, age) values('luke', 28);

本节示例

#include #include int main(int argc, char **argv) { mysql *conn; mysql_res *result; mysql_row row; mysql_field *field; int num_fields; int i; conn = mysql_init(null); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", , null, ); mysql_query(conn, "select * from friends"); result = mysql_store_result(conn); num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { for(i = ; i < num_fields; i++) { if (i == ) { while(field = mysql_fetch_field(result)) { printf("%s ", field->name); } printf("\n"); } printf("%s ", row[i] ? row[i] : "null"); } } printf("\n"); mysql_free_result(result); mysql_close(conn); }

本节示例代码和上一节类似,只是增加了获取表中列名称的代码:

while(field = mysql_fetch_field(result)) {

printf("%s ", field->name);

}

函数mysql_fetch_field返回一个mysql_field结构,从结构中可以获取列的名称。编译后,程序输出如下:

$ ./headers

id name age

1 tom 25

2 elisabeth 32

3 jane 22

4 luke 28

(八)插入图片到mysql数据库

有人喜欢使用mysql来存储图片,而有的人喜欢把图片存储在文件系统中。而当我们要处理成千上万的图片时,会引起技术问题。图片时二进制数据,mysql有种特殊的数据类型,用来存储二进制数据,叫做blob(binary large ojbect)。

mysql> describe images;

+-------+------------+------+-----+---------+-------+

| field | type | null | key | default | extra |

+-------+------------+------+-----+---------+-------+

| id | int(11) | no | pri | | |

| data | mediumblob | yes | | null | |

+-------+------------+------+-----+---------+-------+

2 rows in set (0.00 sec)

这个是本节中我们要使用的表,创建语句如下:

create table images(id int not null primary key, data mediumblob);

以下是本例中所有程序代码:

#include #include int main(int argc, char **argv) { mysql *conn; int len, size; char data[*]; char chunk[**+]; char query[*]; file *fp; conn = mysql_init(null); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", , null, ); fp = fopen("image.png", "rb"); size = fread(data, , *, fp); mysql_real_escape_string(conn, chunk, data, size); char *stat = "insert into images(id, data) values('1', '%s')"; len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk); mysql_real_query(conn, query, len); fclose(fp); mysql_close(conn); }

在本例中,我们把一张图片存储到images表中。图片大小最大不超过1m。

首先我们,打开一个图片文件,并读取图片数据:

fp = fopen("image.png", "rb");

size = fread(data, 1, 1024*1000, fp);

二进制数据可以包含一些特殊的字符,这些在sql语句中可能会引起一些问题。所以必须进行转义,理论上来说,每个字符可能是特殊字符。所以chunk数组大小是data数组大小的两倍,该函数会在chunk数组加上结尾符。

mysql_real_escape_string(conn, chunk, data, size);

一下两行代码拼接insert所用的sql语句:

char *stat = "insert into images(id, data) values('1', '%s')";

len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);

最后,执行sql语句:

mysql_real_query(conn, query, len);

(九)从mysql数据库取回图片

在上一节中,我们把图片保存到数据库中,本节我们把图片从数据库中取回并且还原为图片,本节示例

#include #include int main(int argc, char **argv) { mysql *conn; mysql_res *result; mysql_row row; unsigned long *lengths; file *fp; conn = mysql_init(null); mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", , null, ); fp = fopen("image.png", "wb"); mysql_query(conn, "select data from images where ); result = mysql_store_result(conn); row = mysql_fetch_row(result); lengths = mysql_fetch_lengths(result); fwrite(row[], lengths[], , fp); mysql_free_result(result); fclose(fp); mysql_close(conn); }

首先,我们创建一个文件用来保存图片:

fp = fopen("image.png", "wb");

然后,我们把之前的图片查询出来:

mysql_query(conn, "select data from images where );

之后,得到图片数据和数据长度:

row = mysql_fetch_row(result);

lengths = mysql_fetch_lengths(result);

最后,使用fwrite把图片保存到文件中:

fwrite(row[0], lengths[0], 1, fp);

分享这篇文章:
收藏+0