Linux(ubuntu)操作系统下如何操作Mysql数据库 --------实例

一. 安装Mysql数据库以及osdb驱动

  • 执行以下三条语句
sudo apt-get install mysql-server
sudo apt install mysql-client
sudo apt install libmysqlclient-dev

安装的过程中会有选项,可以自己尝试翻译然后做出选择,设置密码的时候需要当心

  • 用以下命令查看是否安装成功
sudo netstat -tap | grep mysql
  • 如果出现下列图片则说明安装成功

在这里插入图片描述

  • 使用下面两条命令,打开MySQL服务并且用root用户登录。
sudo service mysql start
mysql -u root -p

二.LinuxC下Mysql的常用接口函数

此段来自Linux下C语言连接MySQL

  • 1.使用mysql_init初始化一个连接句柄结构
    mysal_init的函数定义如下:
函数原型:
MYSQL *mysql_init(MYSQL * mysql);
参数说明:
mysql:为NULL,则分配一个(返回其指针)。或按照传入的结构指针进行初始化。
MYSQL:返回值,若为NULL表示出错。
  • 2.连接数据库

目前只是分配和初始化了一个结构,仍然需要使mysql_real_connect来向一个连接提供参数。
mysql_real_connect的函数定义:

MYSQL* mysql_real_connect(MYSQL* connection,  
        const char *server_host,  
        const char *sql_user_name,  
        const char *sql_password,  
        const char *db_name,  
        unsigned int port_number,  
        const char *unix_socket_name,  
        unsigned int flags); 

参数说明:
host:该值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。
user:参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。
passwd:参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。
db:是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
port:若不是0,其值将用作TCP/IP连接的端口号。
unix_socket:若不是NULL,该字符串描述了应使用的套接字或命名管道。
client_flag:的值通常为0。
MYSQL:如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。

  • 3.使用完数据库之后需要关闭与数据库的连接,调用mysql_close

mysql_close的函数定义:

void mysql_close(MYSQL *connection); 
  • 4.数据库错误信息的处理的两个函数
// 返回错误码  
unsigned int mysql_errno(MYSQL *connection);  
// 返回错误详细信息  
char* mysql_error(MYSQL *connection); 
  • 4.函数mysql_options
//函数原型:
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
//参数说明:
//int:返回值,该函数成功时返回0。如果使用了未知选项,返回非0值。
  • 5.函数mysql_query

执行由“Null终结的字符串”查询指向的SQL查询。
正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。

//函数原型:
int mysql_query(MYSQL *mysql, const char *query)
//参数说明:
//int:如果查询成功,返回0。如果出现错误,返回非0值。
  • 6.函数mysql_affected_rows

返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,mysql_affected_rows()的工作方式与mysql_num_rows()类似。

//函数原型:
my_ulonglong mysql_affected_rows(MYSQL *mysql)
//参数说明:
//my_ulonglong:大于0的整数表明受影响或检索的行数。“0”表示UPDATE语句未更新记录,在查询中没有与WHERE匹配的行,或未执行查询。“-1”表示查询返回错误
  • 7.函数mysql_use_result

对于成功检索数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN),必须调用mysql_store_result()或mysql_use_result()。

mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。

使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。

//函数原型:
MYSQL_RES *mysql_use_result(MYSQL *mysql)
  • 8.函数mysql_store_result

mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。

一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。

可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。

一旦完成了对结果集的操作,必须调用mysql_free_result()。

//函数原型:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
  • 9.函数mysql_fetch_row

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

//函数原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
  • 9.函数mysql_free_result
//函数原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

三. 操作实例

  • 连接数据库并返回一个句柄
//连接数据库并且返回数据库的句柄
MYSQL database_connect(){
	MYSQL mysql;			/*初始化一个mysql句柄,用来操作数据库*/
	mysql_init(&mysql);
	if (!mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "client_server", 0, NULL, 0)){		/*通过句柄进行对数据库连接,localhost表示本机【如果网络则为ip地址】*/
        printf("Error connecting to database:%s\n", mysql_error(&mysql));					/*root为数据库的用户, 123456为密码, test为你要连接的数据库*/
    }else{
        printf("数据库连接成功!\n");   
        printf("等待连接......\n");
    }
    return mysql;					/*返回数据库的句柄*/
}
  • 向数据库中插入数据
int database_insert_data_to_clientinfo(MYSQL mysql, Cinfo client){
	int res;							/*查询返回值*/
	char buf[1024] = {0};
	sprintf(buf, "insert into client_info(id,password,address,real_name,phone,sex,product,s_id) values ('%s','%s','%s','%s','%s','%s','%s','%s');",
		client.id, client.password, client.address, client.real_name, client.phone, client.sex, client.product, client.s_id);	/*将客户的信息通过字符串拼接形成一条数据库插入数据的指令*/

	res = mysql_query(&mysql, buf);				/*执行数据库操作语句*/

	if (!res){
		printf("insert %lu rows\n", (unsigned long)mysql_affected_rows(&mysql));		/*执行语句的具体情况*/
	}else{
		fprintf(stderr, "insert error %d:%s\n", mysql_errno(&mysql), mysql_error(&mysql));	/*打印错误信息*/
		return FAILED;	
	}
	//mysql_free_result(res);
	return SUCCESS;
}
  • 查询数据库中的数据并且返回给结构体数组
nt database_search_server_info(MYSQL mysql, Sinfo *server, int *returnCount){
	char *query_server_info = "select * from server_info;";		/*定义一个存放数据库操作指令的字符串*/
	MYSQL_RES *res;												/*res用来保存查询到的结果集*/
    MYSQL_ROW row;												/*用来储存每一行的数据*/
    int count = 0;

	if (mysql_query(&mysql, query_server_info)){				/*调用数据库的查询语句函数,成功返回0,失败返回其他*/
		printf("Failed to query server_info!\n");
		mysql_free_result(res);
		return FAILED;
	}else{
		//printf("Query made ........\n");
        res = mysql_use_result(&mysql);							/*初始化逐行的结果集检索*/
        if (res){
            for (int r = 0; r < mysql_field_count(&mysql); r++){/*返回上次执行语句的的结果列的数目*/
            	
                row = mysql_fetch_row(res);						/*从结果集中获取下一行*/
                if (row == NULL){								/*若下一行为空,则跳出循环*/
                    break;
                }

                count++;										/*记录查询到的客户数量*/

                for (int t = 0; t < mysql_num_fields(res);t++){	/*返回结果集中的列数*/
                	if (t == 0){	
                		strcpy(server[r].id, row[t]);			/*第一列为客服的id,赋值给结构体中的id*/
                	}else if (t == 1){
                		strcpy(server[r].password, row[t]);		/*第二列为客服的password,赋值给结构体中的password*/
                	}else if (t == 2){
                		strcpy(server[r].address, row[t]);		/*第三列为客服的address,赋值给结构体中的address*/
                	}else if (t == 3){
                		strcpy(server[r].real_name, row[t]);	/*第四列为客服的real_name,赋值给结构体中的real_name*/
                	}
                	else if (t == 4){
                		strcpy(server[r].phone, row[t]);		/*第五列为客服的phone,赋值给结构体中的phone*/
                	}
                	else if (t == 5){									
                		strcpy(server[r].sex, row[t]);			/*第六列为客服的sex,赋值给结构体中的sex*/
                	}
                	else if (t == 6){

                		 server[r].client_num = atoi(row[t]);	/*第七列为客服所对接的客户数量,赋值给结构体中的client_number*/
                	}
                	
                    //printf("%s ", row[t]); 
                }
                //printf("\n");
            }  
        }
        mysql_free_result(res);			
	}
	*returnCount = count;									/*释放结果集*/
	return SUCCESS;
}

  • 关闭与数据库的连接
void database_close_connection(MYSQL mysql){		/*断开与数据库的连接*/
	mysql_close(&mysql);
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值