Linux - 操作mysql数据库

1. 接口介绍

本文就详细讲解如何使用MySql的C语言API进行数据库编程。

API,全称Application Programming Interfaces,即应用程序编程接口,我们可以调用这些接口,执行API函数提供的功能。

MySql C语言API就是用C语言编写的MySql编程接口,使用这些接口函数可以实现对MySql数据库的增,删,查,改等操作。

下面会详细讲一些MySql API接口使用规则:

1.1初始化函数

MYSQL *mysql_init(MYSQL *mysql);

mysql 可以传 NULL

返回值:mysql句柄

1.2设置连接选项配置

int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)

描述

可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。

应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。

选项参量指的是你打算设置的选项。Arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。

如:

mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect);配合mysql_ping实现自动重连
mysql_options(m_mysql, MYSQL_SET_CHARSET_NAME, “utf8mb4”);//编码设置

1.3连接数据库

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *passwd, const char *db, unsigned int port,
const char *unix_socket, unsigned long client_flag)

参数介绍

mysql 初始化的句柄指针
host 主机地址
user 用户名 – mysql数据库 root
passwd 用户的密码
db 要连接的数据库
port 端口 一般填0,mysql默认端口 3306
unix_socket 本地套接字 ,一般填NULL
client_flag 连接标志 一般填0
返回值:成功返回 连接句柄,失败返回 NULL

1.4释放连接资源

mysql_close(MYSQY* conn);

释放conn连接资源

1.5数据库操作

int mysql_query(MYSQL *mysql, const char *query)

参数介绍:

mysql 连接句柄
query 执行的sql
反回值:

成功 返回 0
失败 返回 非0

1.6获得结果集的函数

MYSQL_RES *mysql_store_result(MYSQL *mysql)

返回值:

如果读取结果集失败,mysql_store_result()还会返回Null指针。

通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。

如:

MYSQL_RES* res = mysql_store_result(m_mysql);

1.7释放结果集

void mysql_free_result(MYSQL_RES *result)

如:

mysql_free_result(m_res);
m_res = NULL;

1.8取出一行信息

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
描述

检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。

行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。

可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。

返回值

下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。

1.9获取查询的显示列的长度

unsigned int mysql_num_fields(MYSQL_RES *result)

描述:返回结果集中的列数。

注意,你可以从指向结果集的指针或指向连接句柄的指针获得行数。如果mysql_store_result()或mysql_use_result()返回NULL,应使用连接句柄(因而没有结果集指针)。在该情况下,可调用mysql_field_count()来判断mysql_store_result()是否生成了非空结果。这样,客户端程序就能采取恰当的行动,而不需要知道查询是否是SELECT语句(或类似SELECT的语句)。在下面的示例中,介绍了执行该操作的方式。

行数直接判断MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)是否为空

如:

int num_fields = mysql_num_fields(m_res);

1.10获取列信息

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

描述

返回采用MYSQL_FIELD结构的结果集的列。重复调用该函数,以检索关于结果集中所有列的信息。未剩余字段时,mysql_fetch_field()返回NULL。

每次执行新的SELECT查询时,将复位mysql_fetch_field(),以返回关于第1个字段的信息。调用mysql_field_seek()也会影响mysql_fetch_field()返回的字段。

如果调用了mysql_query()以在表上执行SELECT,但未调用mysql_store_result(),如果调用了mysql_fetch_field()以请求BLOB字段的长度,MySQL将返回默认的Blob长度(8KB)。之所以选择8KB是因为MySQL不知道BLOB的最大长度。应在日后使其成为可配置的。一旦检索了结果集,field->max_length将包含特定查询中该列的最大值的长度。

返回值

 

2. 操作数据库

2.1 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>


MYSQL mysql;


int main()
{

	//初始化
	mysql_init(&mysql);

	mysql_set_character_set(&mysql, "utf8");//设置编码格式

	//主机IP 用户名 密码 数据库名 端口 是都使用socket机制登陆 标识位,默认0
	//建立连接
	if (mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "C_DB", 3306, NULL, 0))
	{
		printf("数据库连接成功!\n");
	}
	else
	{
		printf("数据库连接失败!\n");
		printf("错误原因:%s\n", mysql_error(&mysql));
		exit(-1);
	}


	const char* sql = "insert into C_TBL values(1,'李四','女'),(2,'王五','男'),(3, '赵六', '女'),(4, '张三', '男')";
	if (!mysql_query(&mysql, sql))   //向表newtable中插入数据,若查询成功返回0,失败返回随机数
	{
		printf("插入成功\n");
	}
	else
	{
		printf("插入失败\n");
	}

	const char* sql2 = "delete from C_TBL where id=3";
	if (!mysql_query(&mysql, sql2))   //从表newtable中删除数据,若查询成功返回0,失败返回随机数
	{
		printf("删除成功\n");
	}
	else
	{
		printf("删除失败\n");
	}

	const char* sql3 = "update C_TBL set name='bob',sex='无' where id=2";
	if (!mysql_query(&mysql, sql3))   //更新表newtable中的数据,修改id=2的数据
	{
		printf("更新成功\n");
	}
	else
	{
		printf("更新失败\n");
	}

	const char* sql4 = "select * from C_TBL";
	if (!mysql_query(&mysql, sql4))   //从表newtable中查数据,若查询成功返回0,失败返回随机数
	{
		printf("查询成功\n");
	}
	else
	{
		printf("查询失败\n");
	}

	//获取结果集
	MYSQL_RES* res = mysql_store_result(&mysql);
	if (res == NULL)
	{
		printf("store error\n");
		return 4;
	}

	int row = mysql_num_rows(res);//行数
	int col = mysql_num_fields(res);//列数

	//遍历
	for (int i = 0; i < row; ++i)
	{
		MYSQL_ROW rows = mysql_fetch_row(res);
		for (int j = 0; j < col; ++j)
		{
			printf("%s\t", rows[j]);
		}
		printf("\n");
	}

	mysql_free_result(res);				//释放结果集所占用的内存
	mysql_close(&mysql);					//关闭与mysql的连接
	return 0;
}

运行结果:

数据库中表:

取出查询结果:

int main()
{
	//初始化
	mysql_init(&mysql);

	mysql_set_character_set(&mysql, "utf8");//设置编码格式

	//主机IP 用户名 密码 数据库名 端口 是都使用socket机制登陆 标识位,默认0
	//建立连接
	if (mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "C_DB", 3306, NULL, 0))
	{
		printf("数据库连接成功!\n");
	}
	else
	{
		printf("数据库连接失败!\n");
		printf("错误原因:%s\n", mysql_error(&mysql));
		exit(-1);
	}


	const char* sql = "insert into C_TBL values(1,'李四','女'),(2,'王五','男'),(3, '赵六', '女'),(4, '张三', '男')";
	if (!mysql_query(&mysql, sql))   //向表newtable中插入数据,若查询成功返回0,失败返回随机数
	{
		printf("插入成功\n");
	}
	else
	{
		printf("插入失败\n");
	}

	const char* sql2 = "delete from C_TBL where id=3";
	if (!mysql_query(&mysql, sql2))   //从表newtable中删除数据,若查询成功返回0,失败返回随机数
	{
		printf("删除成功\n");
	}
	else
	{
		printf("删除失败\n");
	}

	const char* sql3 = "update C_TBL set name='bob',sex='无' where id=2";
	if (!mysql_query(&mysql, sql3))   //更新表newtable中的数据,修改id=2的数据
	{
		printf("更新成功\n");
	}
	else
	{
		printf("更新失败\n");
	}

	const char* sql4 = "select * from C_TBL";
	if (!mysql_query(&mysql, sql4))   //从表newtable中查数据,若查询成功返回0,失败返回随机数
	{
		printf("查询成功\n");
	}
	else
	{
		printf("查询失败\n");
	}

	//获取结果集
	MYSQL_RES* res = mysql_store_result(&mysql);
	if (res == NULL)
	{
		printf("store error\n");
		return 4;
	}

	int row = mysql_num_rows(res);//行数
	int col = mysql_num_fields(res);//列数

	int id = 0;
	char* name = "";
	char* sex = "";

	//遍历
	for (int i = 0; i < row; ++i)
	{
		MYSQL_ROW rows = mysql_fetch_row(res);
		for (int j = 0; j < col; ++j)
		{
			printf("%s\t", rows[j]);

			if (i == 1)//取第二行的数据
			{
				switch (j)
				{
				case 0:
					id = atoi(rows[j]);//atoi()字符串传int
					printf("id = %d", id);
					break;
				case 1:
					name = rows[j];
					printf("name = %s", name);
					break;
				case 2:
					sex = rows[j];
					printf("sex = %s", sex);
					break;
				default:
					break;
				}
			}
		}
		printf("\n");
	}

	mysql_free_result(res);				//释放结果集所占用的内存
	mysql_close(&mysql);					//关闭与mysql的连接
	return 0;
}

运行结果:

 

3. MySql API汇总

mysql_affected_rows() //返回被最新的UPDATE, DELETE或INSERT查询影响的行数。
mysql_close() //关闭一个服务器连接。
mysql_connect() //连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。
mysql_change_user() //改变在一个打开的连接上的用户和数据库。
mysql_create_db() //创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。
mysql_data_seek() //在一个查询结果集合中搜寻一任意行。
mysql_debug() //用给定字符串做一个DBUG_PUSH。
mysql_drop_db() //抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。
mysql_dump_debug_info() //让服务器将调试信息写入日志文件。
mysql_eof() //确定是否已经读到一个结果集合的最后一行。这功能被反对; mysql_errno()或mysql_error()可以相反被使用。
mysql_errno() //返回最近被调用的MySQL函数的出错编号。
mysql_error() //返回最近被调用的MySQL函数的出错消息。
mysql_escape_string() //用在SQL语句中的字符串的转义特殊字符。
mysql_fetch_field() //返回下一个表字段的类型。
mysql_fetch_field_direct () //返回一个表字段的类型,给出一个字段编号。
mysql_fetch_fields() //返回一个所有字段结构的数组。
mysql_fetch_lengths() //返回当前行中所有列的长度。
mysql_fetch_row() //从结果集合中取得下一行。
mysql_field_seek() //把列光标放在一个指定的列上。
mysql_field_count() //返回最近查询的结果列的数量。
mysql_field_tell() //返回用于最后一个mysql_fetch_field()的字段光标的位置。
mysql_free_result() //释放一个结果集合使用的内存。
mysql_get_client_info() //返回客户版本信息。
mysql_get_host_info() //返回一个描述连接的字符串。
mysql_get_proto_info() //返回连接使用的协议版本。
mysql_get_server_info() //返回服务器版本号。
mysql_info() //返回关于最近执行得查询的信息。
mysql_init() //获得或初始化一个MYSQL结构。
mysql_insert_id() //返回有前一个查询为一个AUTO_INCREMENT列生成的ID。
mysql_kill() //杀死一个给定的线程。
mysql_list_dbs() //返回匹配一个简单的正则表达式的数据库名。
mysql_list_fields() //返回匹配一个简单的正则表达式的列名。
mysql_list_processes() //返回当前服务器线程的一张表。
mysql_list_tables() //返回匹配一个简单的正则表达式的表名。
mysql_num_fields() //返回一个结果集合重的列的数量。
mysql_num_rows() //返回一个结果集合中的行的数量。
mysql_options() //设置对mysql_connect()的连接选项。
mysql_ping() //检查对服务器的连接是否正在工作,必要时重新连接。
mysql_query() //执行指定为一个空结尾的字符串的SQL查询。
mysql_real_connect() //连接一个MySQL服务器。
mysql_real_query() //执行指定为带计数的字符串的SQL查询。
mysql_reload() //告诉服务器重装授权表。
mysql_row_seek() //搜索在结果集合中的行,使用从mysql_row_tell()返回的值。
mysql_row_tell() //返回行光标位置。
mysql_select_db() //连接一个数据库。
mysql_shutdown() //关掉数据库服务器。
mysql_stat() //返回作为字符串的服务器状态。
mysql_store_result() //检索一个完整的结果集合给客户。
mysql_thread_id() //返回当前线程的ID。
mysql_use_result() //初始化一个一行一行地结果集合的检索。

 

posted @ 2023-06-29 09:25  [BORUTO]  阅读(10)  评论(0编辑  收藏  举报