用户管理
用户管理的价值
用户
用户信息
MySQL中的用户,都存储在系统数据库mysql的user表中
use mysql;
select host,user,authentication_string from user;
- host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
- user: 用户名
- authentication_string: 用户密码通过password函数加密后的
创建用户
create user '用户名'@'登陆主机/ip' identified by '密码';
删除用户
drop user '用户名'@'主机名'
修改用户密码
set password=password('新的密码'); //自己改自己密码
set password for '用户名'@'主机名'=password('新的密码') //root用户修改指定用户的密码
给用户授权
刚创建的用户没有任何权限,需要给用户授权。
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
MySQL数据库提供的权限列表:
- 权限列表,多个权限用逗号分开
all [privileges]
表示赋予该用户在该对象上的所有权限 - . : 代表本系统中的所有数据库的所有对象
- 库.* : 表示某个数据库中的所有数据对象
- identified by可选。如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
- 如果发现赋权限后,没有生效,执行如下指令:
flush privileges;
回收权限
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
mysql connect
使用C语言连接mysql,需要使用mysql官网提供的库,在官网上下载合适自己平台的mysql connect库
- 使用的时候需要引入mysql的头文件
#include <mysql.h>
- 其中 include 包含所有的方法声明, lib 包含所有的方法实现
- 通过
mysql_get_client_info()
函数,来验证引入是否成功
mysql接口介绍
初始化mysql_init()
MYSQL* mysql_init(MYSQL* mysql);
链接数据库
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);
设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");
下发mysql命令
int mysql_query(MYSQL *mysql, const char *q);
读取结果
MYSQL_RES *mysql_store_result(MYSQL *mysql);
- 该函数malloc了一片内存空间来存储查询过来的数据,所以一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,数据都存放在MYSQL_RES 变量中。
获取结果行数
longlong mysql_num_rows(MYSQL_RES *res);
获取结果列数
unsigned int mysql_num_fields(MYSQL_RES *res);
获取列名
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
获取结果内容
MYSQL_ROW mysql_fetch_row(MYSQL_RES* result); //按照行读取文件内容,自动更新行数
- 返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char ** ,可以当成一个二维数组来用。
关闭mysql链接
void mysql_close(MYSQL *sock);
案例
// 该函数用来连接 mysqld 并执行mysql语句
// 将执行sql语句后的Question内容传到第二个参数vector中
bool QueryMySql(const std::string &sql, vector<Question> *out)
{
// 创建mysql句柄
MYSQL *my = mysql_init(nullptr);
// 连接数据库
if(nullptr == mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(),db.c_str(),port, nullptr, 0))
{
return false;
}
// 设置该链接的编码格式, 要不然会出现乱码问题
mysql_set_character_set(my, "utf8");
// 执行sql语句
if(mysql_query(my, sql.c_str())!= 0)
{
return false;
}
// 提取结果
MYSQL_RES *res = mysql_store_result(my);
// 分析结果
int rows = mysql_num_rows(res); //获得行数量
int cols = mysql_num_fields(res); //获得列数量
Question q;
//定义Question临时结构体,保存问题信息,插入到vector中
//导入问题的信息到q中
for(int i = 0; i < rows; i++)
{
MYSQL_ROW row = mysql_fetch_row(res);
q.id = row[0];
q.title = row[1];
q.star = row[2];
q.desc = row[3];
q.header = row[4];
q.tail = row[5];
q.cpu_limit = atoi(row[6]);
q.mem_limit = atoi(row[7]);
out->push_back(q);
}
// 关闭mysql连接
mysql_close(my);
return true;
}