本文介绍了数据库mysql的安装配置过程,以及通过VsCode调用数据库实现一些功能
一、安装
如果之前安装过,或者安装失败。清除MySQL缓存并重新安装:运行以下命令以清除所有MySQL缓存文件,并重新安装它们
sudo apt-get remove --purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql sudo dpkg --configure -a sudo apt-get update sudo apt-get install mysql-server-5.7
接下来配置mysql允许远程连接。
MySQL默认只允许本地登录,如果要开启远程连接需要修改MySQL配置文件
1、修改mysqld.cnf配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
打开之后修改bind-address地址为0.0.0.0
之后重启
sudo /etc/init.d/mysql restart
2、创建远程登录的用户
mysql -u root -p show databases; use mysql; show tables; select Host,User from user where User='root';
创建admin用户,并指定该用户可以从任何主机(% 代表通配符,表示所有主机)连接到 MySQL 数据库服务器
create user 'admin'@'%' identified by '123456'; select Host,User from user;
3、为需要远程登录的用户赋予权限
允许任何ip地址(%表示允许任何ip地址)的电脑用admin帐户和密码(123456)来访问这个mysql server。
grant all privileges on *.* to 'admin'@'%';
4、vsCode无法连接数据库Error: ER_NOT_SUPPORTED_AUTH_MODE
原因:登录数据库的客户端跟mysql8.0不兼容了,mysql8.0密码认证采用了新的密码格式
解决办法:mysql终端输入下面命令
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
root、password 分别为数据库账户,密码
二、使用
安装MySQLWorkbench,即可通过SQL操作数据库
create database MING_DB; #创建数据库 # drop database MING_DB; #删除数据库 show databases; use MING_DB; #使用数据库 create table TBL_USER( #创建TBL_USER表 U_ID int primary key auto_increment, U_NAME varchar(32), U_GENDER varchar(32) ); show tables; #使用table
三、
为了通过vscode等开工具来使用数据库,需要安装mysql开发工具
sudo apt-get install libmysqlclient-dev
接下来实现数据的数据插入、查询、删除、存储。
注意对于删除,mysql一般只允许对主键删除,即delete from TBL_USER where U_ID='2';
若要对于针对其他标签的删除,可利用一个存储过程。
#sql DELIMITER $$ create procedure PROC_DELETE_USER(in UNAME varchar(32)) BEGIN set sql_safe_updates=0; delete from TBL_USER where U_NAME=UNAME; set sql_safe_updates=1; END$$ CALL PROC_DELETE_USER('qin');
这段 MySQL 代码定义了一个名为 PROC_DELETE_USER 的存储过程,该存储过程接收一个参数 UNAME,用于指定要删除的用户的用户名。该存储过程执行以下操作:
- 将 SQL 安全更新设置为 0,以便允许执行不安全的 DELETE 操作。
- 删除 TBL_USER 表中 U_NAME 字段值等于传递给存储过程的参数 UNAME 的记录。
- 将 SQL 安全更新设置回 1,以便禁止执行不安全的 SQL 语句。
- 最后一行代码是调用该存储过程,并将字符串 ‘qin’ 作为参数传递给它。也就是说,该代码将会删除 TBL_USER 表中 U_NAME 字段值为 ‘qin’ 的记录。
最后编译指令为gcc -o mysql mysql.c -I/usr/include/mysql/ -lmysqlclient
先看一下关键函数
1、MYSQL mysql:定义一个MYSQL类型的结构体变量,并通过调用mysql_init()函数对其进行初始化,调用mysql_error()函数来获取有关错误信息
2、mysql_real_connect():用于连接到MySQL服务器,返回0,不成功。
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);
1)mysql:一个指向 MYSQL 结构体的指针,用于存储连接的句柄。该结构体已由mysql_init()初始化。
2)host:MySQL 服务器的主机名或 IP 地址。
3)user:连接 MySQL 服务器所使用的用户名。
4)passwd:连接 MySQL 服务器所使用的密码。5)db:要连接的数据库名称。
6)port:MySQL 服务器的端口号。
7)unix_socket:UNIX 域套接字的路径。如果使用 TCP/IP 连接,则设置为 NULL。
8)client_flag:客户端标志位,用于设置连接选项和功能。
3、mysql_real_query():用于向MySQL服务器发送SQL查询或更新语句,返回非0,表示不成功。
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
1)mysql:一个指向 MYSQL 结构体的指针,表示已经建立的数据库连接。
2)query:要执行的 SQL 查询或命令的字符串。
3)length:查询或命令字符串的长度。如果设置为 0,则函数会自动计算字符串的长度。
4、mysql_store_result(&mysql):用于从上一次查询中检索所有结果集。当您使用SELECT语句从数据库检索数据时,结果将返回到客户端,并存储在MYSQL_RES结构中。使用mysql_store_result():函数将整个结果集存储在内存中,并返回一个指向此结果集的MYSQL_RES*指针。这使得我们可以轻松地遍历和操作结果集。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
mysql:一个已经通过mysql_real_connect()函数连接到MySQL服务器的MYSQL对象指针。
5、mysql_num_rows()用于获取查询结果集中行的数量。
unsigned long mysql_num_rows(MYSQL_RES *result);
6、 mysql_fetch_row():用于从查询结果集中逐行获取数据
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
result:一个指向MYSQL_RES结构的指针,该结构包含了查询结果集的详细信息。
需要注意的是,mysql_fetch_row()函数只返回一行数据,并且每次调用该函数会将结果集游标移动到下一行。因此,在遍历结果集时需要在循环中多次调用mysql_fetch_row()函数来获取所有行的数据。while ((row=mysql_fetch_row(res))):在这个循环中,每一次mysql_fetch_row()都获得当前行数据库,并赋值给数组row,然后自动滑向下一行;在取出最后一行后,函数将返回false,循环结束。就可以把结果集中的所有数据逐行取出并显示。
7、 mysql_num_fields:用于获取查询结果集中的字段数目(列数)。
unsigned int mysql_num_fields(MYSQL_RES *result);
8、mysql_fetch_fields:用于获取结果集中的字段信息。它可以返回一个数组,包含每个字段的详细信息。
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);
参数 result 是一个指向已经执行完查询并获取到结果集的 MYSQL_RES 结构体的指针。
该函数返回一个指向 MYSQL_FIELD 结构体数组的指针,数组的每个元素代表结果集中的一个字段。MYSQL_FIELD 结构体定义了字段的各种属性,例如字段名、字段类型、字段长度、字段标志等。
以下是 MYSQL_FIELD 结构体的常见字段:
char *name:字段名。
char *org_name:原始字段名。
int name_length:字段名长度。
unsigned long length:字段值的最大长度。
enum enum_field_types type:字段类型(例如,字符串、整数等)。
unsigned int flags:字段的标志。
unsigned int decimals:对于浮点数类型的字段,小数点后的位数。
四、流程
- 通过mysql_init()函数初始化MYSQL对象。
- 使用mysql_real_connect()函数连接到MySQL服务器。
- 执行SQL查询语句,例如通过mysql_query()函数发送查询给服务器。
- 调用mysql_store_result()函数以将查询结果存储在客户端内存中。
- 使用mysql_fetch_row()、mysql_fetch_array()或其他类似函数逐行获取结果集中的数据。
- 使用完结果集后,使用mysql_free_result()函数释放结果集所占用的内存。
#include<stdio.h> #include<string.h> #include <mysql.h> #define MING_DB_IP "192.168.42.128" #define MING_DB_PORT 3306 #define MING_DB_USENAME "admin" #define MING_DB_PASSWORD "123456" #define MING_DB_DEFAULTDB "MING_DB" #define SQL_INSERT_TRL_USER "insert TBL_USER(U_NAME,U_GENDER) values('zxm','women');" #define SQL_SELECT_TBL_USER "select * from TBL_USER;" #define SQL_DELETE_TBL_USER "CALL PROC_DELETE_USER('zxm')" //查询 int ming_mysql_select(MYSQL *handle){ //发送sql语句-->select if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //不等于0,不成功 printf("mysql_real_query:%s\n",mysql_error(handle)); return -1; } //存储结果 //mysql_store_result()用于从上一次查询中检索所有结果集 MYSQL_RES *res=mysql_store_result(handle); if (res==NULL){ printf("mysql_store_result:%s\n",mysql_error(handle)); return -2; } //判断结果行数和列数 //mysql_num_rows()用于获取查询结果集中行的数量 int rows=mysql_num_rows(res); printf("rows:%d\n",rows); int fields=mysql_num_fields(res); printf("fields:%d\n",fields); //抓取数据 MYSQL_ROW row; //mysql_fetch_row()用于从查询结果集中获取下一行数据 while ((row=mysql_fetch_row(res))){ int i=0; for (i=0;i<fields;i++){ printf("%s\t",row[i]); } printf("\n"); } mysql_free_result(res); return 0; } int main(){ //定义一个MYSQL类型的结构体变量,并通过调用mysql_init()函数对其进行初始化 //调用mysql_error()函数来获取有关错误信息 MYSQL mysql; if (mysql_init(&mysql)==NULL){ printf("mysql_init:%s\n",mysql_error(&mysql)); return -1; } //mysql_real_connect()用于连接到MySQL服务器.它需要以下参数: /*1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。 2、MySQL服务器所在主机名或IP地址。 3、登录MySQL服务器时使用的用户名。 4、登录MySQL服务器时使用的密码。 5、要连接的数据库名称。 6、端口号(默认为3306)。 7、规定 socket 8、规定不同的连接选项 */ if(!mysql_real_connect(&mysql,MING_DB_IP,MING_DB_USENAME,MING_DB_PASSWORD, MING_DB_DEFAULTDB,MING_DB_PORT,NULL,0)){ //等于0,不成功 printf("mysql_real_connect:%s\n",mysql_error(&mysql)); return -2; } printf("case:mysql insert \n"); #if 1 /*mysql_real_query()用于向MySQL服务器发送SQL查询或更新语句。它需要以下参数: 1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。 2、要执行的SQL查询或更新语句。 3、SQL查询或更新语句的长度(如果为0,则将自动计算)。 */ if(mysql_real_query(&mysql,SQL_INSERT_TRL_USER,strlen(SQL_INSERT_TRL_USER))){ //不等于0,不成功 printf("mysql_real_query:%s\n",mysql_error(&mysql)); return -3; } #endif //输出表的结果 ming_mysql_select(&mysql); printf("case:mysql delete \n"); #if 1 /*mysql_real_query()用于向MySQL服务器发送SQL查询或更新语句。它需要以下参数: 1、MYSQL类型的结构体指针,该结构体已由mysql_init()初始化。 2、要执行的SQL查询或更新语句。 3、SQL查询或更新语句的长度(如果为0,则将自动计算)。 */ if(mysql_real_query(&mysql,SQL_DELETE_TBL_USER,strlen(SQL_DELETE_TBL_USER))){ //不等于0,不成功 printf("mysql_real_query:%s\n",mysql_error(&mysql)); return -3; } #endif //输出表的结果 ming_mysql_select(&mysql); //关闭 mysql_close(&mysql); return 0; }



