Linux下访问数据库

article/2025/11/4 8:12:02

Linux下访问数据库

         声明:本文只简单描述Linux系统下访问mysql数据库的步骤,关于连接上数据库之后的简单的对于数据库的增删改查等操作只是稍微提及,关于增删改查的语句书写,本文不再讲述。

         一般来说,访问数据库有如下几个步骤:

         1.初始化mysql环境

         2.连接数据库

         3.执行sql语句

         4.获取查询结果

         5.显示结果

         6.关闭数据库

         7.释放mysql环境

         针对以上7个步骤,接下来重点描述以下者7个步骤中所需要做的工作和所使用到的函数。

1.初始化mysql环境

         作为连接数据库前的准备工作,这个步骤要做的事情其实还是很多的。首先需要创建MYSQL变量,用来存储与连接有关的数据信息。其结构体的结构非常复杂,不需要过多的理解。在实际使用时有着其固定的使用方法,只需记住就行。

typedef struct st_mysql 
{NET net;           gptr connector_fd; char *host, *user,*passwd,*unix_socket,*server_version, *host_info,*info,*db;unsigned int port,client_flag,server_capabilities;unsigned int protocol_version;unsigned int field_count;unsigned int server_status;unsigned long thread_id;      my_ulonglong affected_rows;my_ulonglong insert_id;       my_ulonglong extra_info;              unsigned long packet_length;enum mysql_status status;MYSQL_FIELD *fields;MEM_ROOT field_alloc;my_bool free_me;       my_bool reconnect;    struct st_mysql_options options;char scramble_buff[9];struct charset_info_st *charset;unsigned int server_language;
}MYSQL;

         除此之外,此阶段还有两个函数也至关重要,mysql_init()函数和mysql_library_init()函数。

MYSQL *mysql_init(MYSQL *mysql);

功能:用来初始化一个连接句柄

若函数成功执行,则返回一个MYSQL类型的指针,失败则返回NULL。

int mysql_library_init(int argc,char **argv,char **groups);

功能:用来初始化mysql库

关于这两个函数的参数含义此处不做解释,因为本鸟也不知道,唯一知道的就是这么用就对了,实际使用时给三个参数赋值为0,NULL,NULL,具体使用方法会在最后的案例中提及。

还有一个与mysql_library_init()函数相对应的函数mysql_library_end(),用来关闭服务器端数据库。这两个函数必须放在一起使用,先初始化,最后再关闭数据库,如果只初始化不关闭,那么之前申请的一块内存将会一直存在,容易导致内存泄漏。

2.连接数据库

         连接数据库部分涉及到两个函数,分别是mysql_real_connect()函数和mysql_select_db()函数。

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 clientflag);

功能:用来连接数据库

参数说明:

mysql:之前定义的MYSQL变量

host:MYSQL服务器的地址

user:登陆用户名

passwd:登陆密码

db:要连接的数据库

port:MYSQL服务器的TCP服务端口

unix_socket:unix连接方式,为NULL时表示不使用socket或管道机制

clientflag:mysql运行为ODBC数据库的标记,一般取0

返回值:成功,返回*mysql指针,失败,返回NULL

         此函数的参数较多,实际使用时不会给每个参数都赋值的,只需要记住最常被赋值的几个参数即可。

int mysql_select_db(MYSQL *mysql,const char *db);

功能:使得由db指定的数据库成为由mysql指定的连接上的默认数据库

返回值:成功,返回0;失败,返回一个非0值。

错误代码:

CR_COMMANDS_OUT_OF_SYNC:以不恰当的顺序执行了命令

CR_SERVER_GONE_ERROR:mysql服务器不可用

CR_SERVER_LOST:在查询过程中与服务器的连接丢失

CR_UNKNOWN_ERROR:出现未知错误

3.执行sql语句

         当数据库连接成功之后就可以对数据库中的数据进行增删改查等操作了,这些增删改查的语句本鸟不再书写,相信大家都会吧。但是,这些语句并不是独自出现的,而是把它存储在一个缓冲区里,作为函数参数使用,此函数为:

int mysql_query(MYSQL *mysql,const char *q);

功能:执行sql语句

参数:第一个参数为mysql结构体,第二个参数为操作命令。

         还有一个可用来执行sql语句的函数:

int mysql_real_query(MYSQL *mysql,const char *query,unsigned long length);

功能:进行数据库查询。执行由query指向的sql查询,正常情况下,字符串必须包含一条sql语句,而且不应该为语句添加终结分号。

参数说明:

mysql:MYSQL变量

query:查询语句

length:查询语句的长度

         以上两个函数都是用来进行数据库查询的函数。不同之处在于,对于包含二进制数据的查询,必须使用mysql_real_query()函数,这是因为  二进制数据可能会包含‘\0’字符,同时,mysql_real_query()函数执行速度快,这是因为此函数不会在查询字符串上调用strlen()函数。

         执行sql语句后,我们通过调用mysql_store_result()或mysql_use_result()函数返回的MYSQL_RES变量获取查询结果数据。

MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES *mysql_use_result(MYSQL *mysql);

这两个函数分别代表了获取查询结果的两种方式。

         第一种,调用mysql_store_result()函数将从mysql服务器查询的所有数据都存储到客户端,然后读取;

         第二种,调用mysql_use_result()初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row()读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result()。

4.获取查询结果

         我们把执行完sql语句的返回的结果称为结果集,其用一个MYSQL_RES结构体来存储。本部分的主要内容就是从返回的结果集里获取查询结果。

typedef struct st_mysql_res 
{my_ulonglong row_count;unsigned int field_count, current_field;MYSQL_FIELD *fields;MYSQL_DATA *data;MYSQL_ROWS *data_cursor;MEM_ROOT field_alloc;MYSQL_ROW row;           MYSQL_ROW current_row;   unsigned long *lengths; MYSQL *handle;      my_bool eof;         
}MYSQL_RES;

         这样的结构体着实令本鸟头大。

         我们执行sql语句后的结果就存储在这样一个结构体中,但是我们要想从这个结构体中获取到,或者说提取出我们需要的信息,则就必须使用MYSQL_FIELDMYSQL_ROWS结构体来获取。这个结构体包含着结果集中的字段名、字段类型、字段大小等信息,可以通过重复调用mysql_fetch_fields()函数来获得所有字段的信息,即列信息或列数据。

typedef struct st_mysql_field 
{char *name;                  char *table;                 char *def;                    enum enum_field_types type;  unsigned int length;         unsigned int max_length;    unsigned int flags;         unsigned int decimals;  
} MYSQL_FIELD;
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

功能:读取结果集字段

         与之对应的是MYSQL_ROWS结构体里的mysql_fetch_row()函数,此函数用来获得结果集中的行信息。

MYSQL_ROW *mysql_fetch_row(MYSQL_RES *res);

功能:读取结果集数据

返回值:该函数返回MYSQL_ROW型的变量,即字符串数组,假设其为row,则row[i]为第i个字段的值,当到结果集尾部时,此函数返回NULL。

         刚才说到mysql_fetch_row()函数是用来获取数据集中的数据信息,它只能一行一行的来获取,所以还得有个函数用来统计结果集中的行数。同样的,也得用一个函数来获取结果集中的字段的数量。

unsigned int mysql_num_fields(MYSQL_RES *res);

功能:获取结果集中字段的数量

unsigned int mysql_num_rows(MYSQL_RES *res);

功能:获取结果集中行数

         结果集使用完毕后,还需释放掉结果集,避免内存泄漏。

void mysql_free_result(MYSQL_RES *res);

5.关闭数据库

         不需要继续查询mysql数据库时,应及时关闭数据库连接。

void mysql_close(MYSQL *sock);

         sock为连接函数返回的变量。

6.释放mysql环境

         在初始化阶段中提到了一个与mysql_library_init()函数相对应的函数mysql_library_end(),此函数用来及时释放mysql环境,来终止使用mysql数据库。

案例:MysqlDemo.c

         本案例主要是通过远程访问数据库来对数据库里的数据信息进行增删改查等操作。在正式编码之前,我们首先需要直到关于本案例所要用到的数据库的基本信息。本案例所使用的数据库为StaffDB,该数据库里有3张表,分别为Department(部门)、Work(职务)、Staff(员工信息),每张表的结构和数据如下所示:

Department(部门):

Work(职务):

Staff(员工):

         这3张表的截图都是在Windows系统下所截取的,我们就是要通过案例来对这些数据加以操作。

MysqlDemo.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>//查询
int Select_sql(MYSQL *p_sock)
{//声明缓冲区并初始化char buffer[1024]={0};memset(buffer,0x00,1024);snprintf(buffer,sizeof(buffer),"%s","select * from Department");//执行sql语句int ret = mysql_query(p_sock,buffer);if(ret != 0){printf("查询错误:%s\n",mysql_error(p_sock));return -1;}//结果集MYSQL_RES *res;//数据行MYSQL_ROW row;//记录结果的行数int rows = 0;//记录结果的列数int columns = 0;//获取查询结果res = mysql(store_result(p_sock));if(res == NULL){printf("获取结果集错误:%s\n",mysql_error(p_sock));return -1;}//获取查询结果的行数rows = mysql_num_rows(res);if(rows < 0){printf("获取查询结果的行数错误:%s\n",mysql_error(p_sock));return -1;}if(rows == 0){printf("该查询结果中无数据!\n");return 0;}//获取查询结果的列数columns = mysql_num_fields(res); if(rows < 0){printf("获取查询结果的列数错误:%s\n",mysql_error(p_sock));return -1;}//获取每一行数据while((row = mysql_fetch_row(res)) != NULL){int i;for(i = 0;i < columns;i++){printf("%s\t",rows[i]);}printf("\n");}//释放结果集所占用的空间mysql_free_result(res);return 0;}
}//插入
int Insert_sql(MYSQL *p_sock)
{char buffer[1024] = {0};//sql语句memset(buffer,0x00,1024);snprintf(buffer,1023,"%s","insert into Department(Department_id,Department_name,Remark) value('D07','综合部','综合部')");//执行sql语句if(mysql_query(p_sock,buffer) != 0){perror("mysql_query");return -1;}return 0;
}//更新
int Update_sql(MYSQL *p_sock)
{char buffer[1024] = {0};//sql语句memset(buffer,0x00,1024);snprintf(buffer,1023,"%s","update Department set Remark = "综合管理" where Department_id = 'D07'");//执行sql语句if(mysql_query(p_sock,buffer) != 0){perror("mysql_query");return -1;}return 0;
}//删除
int Delete_sql(MYSQL *p_sock)
{char buffer[1024] = {0};//sql语句memset(buffer,0x00,1024);snprintf(buffer,1023,"%s","delete from Department where Department_id = 'D07'");//执行sql语句if(mysql_query(p_sock,buffer) != 0){perror("mysql_query");return -1;}return 0;
}int main()
{//按照文档中的步骤,首先进行对sql环境的初始化//1.初始化sql环境//定义MYSQL变量MYSQL mysql,*p_mysql,*p_sock;//初始化mysql句柄p_mysql = mysql_init(&mysql);if(p_mysql == NULL){printf("初始化错误!\n");return -1;}//初始化MySQL库int ret = mysql_library_init(0,NULL,NULL);if(ret ==0){printf("初始化数据库成功!\n");}else{printf("初始化数据库失败!\n");return -1;}if(p_mysql != NULL && ret == 0){printf("初始化sql环境成功!\n");}//2.连接数据库p_sock = mysql_real_connect(p_mysql,"127.0.0.1","root","(NavyBlue123)",NULL,0,NULL,0);if(p_sock == NULL){//输出错误原因printf("连接错误:%s\n",mysql_error(p_mysql));return -1;}//选择数据库int r = mysql_swlect_db(p_sock,"StaffDB");if(r != 0){printf("选择数据库出错:%s\n",mysql_error(p_mysql));return -1;}//设置编码格式,注意,此处一定要设置编码格式,不然最后的查询结果中的中文会显示乱码mysql_query(&mysql,"SET NAMES utf8");if(p_sock != NULL && r == 0){printf("数据库连接成功!\n");}//3.执行sql语句,此部分我们另写函数实现//查询部分我们选择查询3张表的整体信息Select_sql(p_sock);//插入部分我们选择给Staff表中插入一条新的员工信息Insert_sql(p_sock);//修改,即更新Update_sql(p_sock);//删除部分我们选择删除新插入到Staff表中的那条员工信息Delete_sql(p_sock);//4.获取查询结果,此部分会在执行sql语句的函数里一并处理//5.关闭数据库mysql_close(&mysql);//6.释放sql环境,终止使用MySQL库mysql_library_end();return 0;
}

         由于本鸟的Mysql在安装的时候丢失了重要的文件,所以此文件无法运行,还希望大家在闲余时间能够亲自跑一下代码,熟悉一下连接过程为好。


http://chatgpt.dhexx.cn/article/V4A3N7wa.shtml

相关文章

Linux_MySQL数据库基础

文章目录 1.基本使用连接MySQL服务器创建与删除数据库创建删除数据库表查看数据库表结构&#xff0c;向数据库表中插入&#xff0c;查询数据2. MySQL架构SQL分类存储引擎 注意一般情况下&#xff1a; MySQL服务并不暴露在公网上。MySQL一般会更改服务端口。 MySQL服务&#x…

linux:数据库连接

MySql数据库 视图&#xff1a;虚拟的表 索引&#xff1a;目录 事务&#xff1a;操作 安装数据库&#xff1a;sudo apt install mysql-server //mysql8.0 安装C/C开发库&#xff1a;sudo apt install libmysqlclient-dev 数据库&#xff1a;1.mysql 文件本身 2…

在linux上安装数据库服务

一、通过本地包安装mysql 1.先通过软件将包从windows传到linux上&#xff0c;四个rpm包。 2.检查Linux上是否卸载了数据库自带的包&#xff0c;会导致安装不上。如果有&#xff0c;卸载掉。 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载命令 rpm -e -nodeps 自带的包…

Linux环境下的数据库(基础篇上)

数据库 一、Linux环境下数据库的安装二、数据库的基础操作三、数据库中表的操作 一、Linux环境下数据库的安装 需要在 root 用户权限下进行数据库的一系列安装操作 安装 mariadb 服务&#xff1a; # yum install -y mariadb-server安装 mariadb 命令行客户端&#xff1a; …

Linux之数据库操作

一、mysql基本操作 1&#xff0c;连接数据库 mysql -u root -p -h 127.0.0.1 mysql -u root -p -h 192.168.12.56 2&#xff0c;授予远程连接的权限 grant all privileges on *.* to root"%" identified by "nihao123" 3&#xff0c;修改root用户的密码 先…

Linux和数据库

Linux命令:软件测试第一个任务,一般都需要进行环境搭建,一部分环境搭建内容是在服务器上实现的,跟服务器交互(没有图形化页面),需要使用Linux命令 数据库:所有的软件在使用过程中所产生的数据,最终都要存在数据库当中,而测试工作往往会需要去校验数据的正确与否,因此需要学习数…

Linux服务器操作数据库

一、进入mysql数据库 1、使用命令连接进入数据库 mysql -u root -p参数解析&#xff1a; root-是连接数据库的用户 连接成功的截图如下 2、可以查看当前用户有哪些数据库权限 show databases; 3、进入到指定的数据库 use test;参数解析&#xff1a;test-是数据库名称 4、…

SolrCloud介绍和应用

SolrCloud是基于Solr和Zookeeper的分布式搜索方案&#xff0c;是正在开发中的Solr4.0&#xff08;目前还是ALPHA版本,基于lucene4.0&#xff09;的核心组件之一&#xff0c;它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能&#xff1a;1&#xff09;集中…

Solr简介Solr使用及SolrCloud搭建

一、Solr简介 1、Solr是什么&#xff1f; 1.1就是一个war项目 2、自己的项目如何Solr进行交互&#xff1f; 2.1特定的API叫做SolrJ(底层其实就是HttpClient) 3、具备数据持久化功能 3.1Solr中会存储需要进行搜索的数据 3.2把所有的数据都初始化到Solr中. 4、Solr作用&#…

solrcloud导入mysql数据配置

最简单的solr7集群搭建(不需要tomcat) 添加jar (三个节点都要&#xff09; 复制solr解压目录中dist下的solr-dataimporthandler-7.5.0.jar solr-dataimporthandler-extras-7.5.0.jar 复制到WEB-INF/lib下 添加mysql-connection jar包到WEB-INF/lib下&#xff0c;我这里是mysq…

Solr+Zookeeper 搭建搜索集群SolrCloud

目录 一、简介 1、SolrCloud是个什么玩意&#xff1f; 2、Solr是个什么玩意&#xff1f; 3、zookeeper是个什么玩意&#xff1f; 4、实现负载均衡的方式&#xff1a; (Nginx、Redis槽、Zookeeper) 二、SolrCloud的结构 1、物理结构 2、逻辑结构 三、SolrCloud的搭建(3…

solrCloud分布式检索流程

好久没写solr的文章了&#xff0c;刚好需要在公司作个分享&#xff0c;先总结一些先。 引用请声明原文&#xff1a;http://blog.csdn.net/duck_genuine/article/details/17014991 solrCloud分布式检索主要流程如下&#xff1a; 搜索 video&#xff0c;“美女斗秀场” 取按…

solr全文检索技术学习(三)-搭建SolrCloud集群问题总结

什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&#xff0c;搜索请…

对SolrCloud集群Collection进行手动二次Sharding

我们已经基于SolrCloud 4.3.1Tomcat 7搭建了搜索服务器集群&#xff0c;一个Collection对应3个节点上的3个分片&#xff08;Shard&#xff09;&#xff0c;同时包含对应分片的副本&#xff08;Replica&#xff09;&#xff0c;此时&#xff0c;该Collection一共有6000万左右Doc…

Solr SolrCloud相关概念

Solr支持服务器的分布式集群部署&#xff0c;即SolrCloud。在SolrCloud中&#xff0c;一个索引可以被分布到不同的服务器&#xff0c;即不同的node&#xff0c;所有的这些node组成一个collection&#xff0c;并且充分考虑了高可靠性和容错的设计。 SolrCloud使用zookeeper来管理…

SolrCloud概述

在Lucene/Solr的SVN trunk中的SolrCloud已经可用, 在即将发布的4.0版本中将正式包含. 目前SolrCloud已经成熟, 可以支持分布式索引和分布式搜索. 下面是我们一个项目采用新的SolrCloud的部署结构图: 看起来是否非常简单? 下面我们看看内部的一些实现细节. SolrCloud功能和架…

solr8.9部署solrcloud

安装solr tar xf solr-8.9.0.tgz cd solr-8.9.0 ./bin/install_solr_service.sh /root/solr-8.8.2.zip -d /data/solr -u solr -n # /root/solr-8.8.2.zip 指定tar包 # -d: 指定solr可写目录&#xff0c;solr数据文件、日志、pid文件、索引会写入到此目录下。默认/var/solr #…

搭建SolrCloud的详细步骤

###一、需求 SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用 SolrCloud。 当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&#xff0c;搜索请求并发很高&a…

SolrCloud Collection 创建

环境版本: CDH 5.12.0; Solr 4.10.3 CDH搭建SolrCloud集群十分方便,添加服务->solr->选择主机->next即可 在SolrCloud中,跨多个节点的索引分割称为集合(collection),见下图: [root@DXHY-YFEB-01 solr]# pwd /var/lib/solr [root@DXHY-YFEB-01 solr]# mv Invoi…

solrcloud集群搭建

什么是SolrCloud 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案&#xff0c;当你需要大规模&#xff0c;容错&#xff0c;分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的&#xff0c;当索引量很大&#xff0c…