MYSQL
(一)关于本教程
这是一本关于MYQL的C语言编程的入门教程,它讲述了MYSQL的C
(二)关于MYSQL数据库
MYSQL是一个领先的开源数据管理系统,是一个多用户、多线程的数据库系统。MYSQL在web应用中特别流行,是非常流行的LAMP(L-linux,
(三)第一个示例
第一个示例简单的测试MYSQL的API函数,代码如下:
#include
#include
int main(int argc, char **argv)
{
printf("MySQL client version: %s\n", mysql_get_client_info());
return 0;
}
API
gcc
执行程序verion,得出如下输出结果:
代码详解:
首先,我们包含必要的头文件myql.h和my_global.h,mysql.h是MYSQL函数调用中要包含的最重要的头文件。my_global.h包含了一些全局函数的声明以及标准输入输出的头文件。
printf("MySQL
这些代码打印了Mysql客户端的版本号,通过使用mysql_get_client_info
(四)创建数据库
以下代码演示如何创建数据库:
#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(1);
}
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);
}
if (mysql_query(conn, "create database testdb")) {
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}
mysql_close(conn);
}
以上示例代码先连接到mysql数据库,然后创建一个testdb数据库。现在登录到数据库中验证一下:
mysql>
+--------------------+
|
+--------------------+
|
|
|
+--------------------+
3
经验证,数据库testdb确实已经创建好了。
在这个示例代码中,我们进行了错误检查,进行错误检查是非常重要的,因为数据库编程中有许多地方会出现错误。为了简明起见,后面的示例将忽略错误检查。
本示例代码可以划分为以下几个部分:
1.初始化一个链接结构。
2.创建一个链接。
3.执行查询。
4.关闭链接。
MYSQL*
首先,声明一个conn指针指向一个MYSQL结构体,这个结构体就是一个数据库连接句柄。
conn
函数mysql_init将返回一个链接句柄。
我们检查函数返回值,如果mysql_init函数执行失败,我们打印错误信息并且结束程序。
if
函数mysql_real_connect建立一个到mysql数据库的链接。调用这个函数要提供
if
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", 0, NULL, 0);
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
1.建立链接
mysql_real_connect(conn,
2.建立writers表,该表只有一列,类型为VARCHAR。
mysql_query(conn,
3.插入数据
mysql_query(conn,
mysql_query(conn,
mysql_query(conn,
mysql_query(conn,
mysql_query(conn,
4.验证数据
mysql>
+-------------------+
|
+-------------------+
|
|
|
|
|
+-------------------+
5
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", 0, NULL, 0);
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 = 0; 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,
2.获取结果集
result
3.获取writers表中的所有字段
num_fields
4.获取每行数据,并且输出到屏幕上
5.释放结果集
6.关闭链接
(七)列头
在本节中,将演示查询数据并获取表中每一列的名字。
本节示例代码如下:
#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", 0, NULL, 0);
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 = 0; i < num_fields; i++)
{
if (i == 0) {
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);
}
本节示例代码和上一节类似,只是增加了获取表中列名称的代码:
函数mysql_fetch_field返回一个MYSQL_FIELD结构,从结构中可以获取列的名称。编译后,程序输出如下:
$
id
1
2
3
4
(八)插入图片到Mysql数据库
有人喜欢使用mysql来存储图片,而有的人喜欢把图片存储在文件系统中。而当我们要处理成千上万的图片时,会引起技术问题。图片时二进制数据,mysql有种特殊的数据类型,用来存储二进制数据,叫做BLOB(Binary
mysql>
+-------+------------+------+-----+---------+-------+
|
+-------+------------+------+-----+---------+-------+
|
|
+-------+------------+------+-----+---------+-------+
2
这个是本节中我们要使用的表,创建语句如下:
create
以下是本例中所有程序代码:
#include
#include
int main(int argc, char **argv)
{
MYSQL *conn;
int len, size;
char data[1000*1024];
char chunk[2*1000*1024+1];
char query[1024*5000];
FILE *fp;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
fp = fopen("image.png", "rb");
size = fread(data, 1, 1024*1000, 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。
首先我们,打开一个图片文件,并读取图片数据:
二进制数据可以包含一些特殊的字符,这些在sql语句中可能会引起一些问题。所以必须进行转义,理论上来说,每个字符可能是特殊字符。所以chunk数组大小是data数组大小的两倍,该函数会在chunk数组加上结尾符。
一下两行代码拼接insert所用的sql语句:
最后,执行sql语句:
mysql_real_query(conn,
(九)从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", 0, NULL, 0);
fp = fopen("image.png", "wb");
mysql_query(conn, "SELECT data FROM images WHERE id=1");
result = mysql_store_result(conn);
row = mysql_fetch_row(result);
lengths = mysql_fetch_lengths(result);
fwrite(row[0], lengths[0], 1, fp);
mysql_free_result(result);
fclose(fp);
mysql_close(conn);
}
首先,我们创建一个文件用来保存图片:
fp
然后,我们把之前的图片查询出来:
之后,得到图片数据和数据长度:
row
lengths
最后,使用fwrite把图片保存到文件中:
fwrite(row[0],