Linux数据库:【视图】【用户管理】【MySQL访问】【图形化界面登陆数据库】
初始化mysql_init()要使用库,必须先进行初始化!如: MYSQL *mfp = mysql_init(NULL)链接数据库mysql_real_connect下发mysql命令mysql_queryint main()// 1. 创建句柄return 1;// 2.链接数据库return 2;// 3.设置字符集// 4.执行命令break;return 0;数据库中查:但是使用查询语句
目录
一. 视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视 图的数据变化会影响到基表,基表的数据变化也会影响到视图。
1.1 基本使用
create view 视图名 as select语句;
实际上就是创建一个新的表。
注意视图和基表是数据是打通的:
删除
drop view 视图名;
1.2 视图规则和限制
与表一样,必须唯一命名(不能出现同名视图或表名)
创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
视图不能添加索引,也不能有关联的触发器或者默认值 视图可以提高安全性,必须具有足够的访问权限
order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图 中的 order by 将被覆盖
视图可以和表一起使用
二. 用户管理
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。
2.1 用户
2.1.1 用户信息
MySQL中的用户,都存储在系统数据库mysql的user表中
host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
user: 用户名
authentication_string: 用户密码通过password函数加密后的
*_priv: 用户拥有的权限
2.1.2 创建用户
create user '用户名'@'登陆主机/ip' identified by '密码';
此时就可以使用新创建的用户进行登录了:
不能远程登录
想远程登录的话可以这样写:
create user '用户名'@'%' identified by '密码';
写成%,但是特别不建议。
2.1.3 删除用户
drop user '用户名'@'主机名'
再去查就没了:
2.1.4 修改用户密码
自己改自己的:
set password=password('新的密码');
root用户修改指定用户的密码,用update也可以
set password for '用户名'@'主机名'=password('新的密码');
2.2 数据库的权限
2.2.1 给用户授权
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
grant select on ...
grant select, delete, create on ....
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
*.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
例如:我用root用户创建一个test数据库,里面创建一个user表,再在里面添加数据:
创建一个用户:
在另一个终端登录这个用户:
查不到刚刚创建的表。这里就改一下权限:
另一台主机就可以看到了,并且可以做任何事情:
查看赋予的权限:
2.2.2 回收权限
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
root移除lwz 的权限
用户lwz就查不到了:
root下,使用命令可以查看给lwz 的权限:
三. MySQL访问
先做一下准备工作,给lwz用户添加test数据库的所有权限:
尝试链接mysql client 通过 mysql_get_client_info() 函数,来验证我们的引入是否成功
成功:
MySQL接口介绍
初始化mysql_init()
要使用库,必须先进行初始化!
MYSQL *mysql_init(MYSQL *mysql);
如: MYSQL *mfp = mysql_init(NULL)
链接数据库mysql_real_connect
下发mysql命令mysql_query
第一版测试,输入命令测试正常执行命令:
#include <iostream>
#include <mysql/mysql.h>
#include <string>
const std::string host = "127.0.0.1";
const std::string passwd = "123456";
const std::string db = "test";
const std::string user = "lwz";
const unsigned int port = 3306;
int main()
{
// std::cout << "mysql client Version: " << mysql_get_client_info() << std::endl;
// 1. 创建句柄
MYSQL* mysql = mysql_init(nullptr);
if(mysql == nullptr)
{
std::cout << "mysql_init error" << std::endl;
return 1;
}
// 2.链接数据库
if(mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0) == nullptr)
{
std::cout << "connect error" << std::endl;
return 2;
}
std::cout << "connect success" << std::endl;
// 3.设置字符集
mysql_set_character_set(mysql, "utf8");
// 4.执行命令
std::string sql;
while(std::getline(std::cin,sql))
{
if(sql == "quit")
{
break;
}
int n = mysql_query(mysql,sql.c_str());
if(n==0)
{
std::cout << sql << " success " << n <<std::endl;
}
else
{
break;
}
}
mysql_close(mysql);
return 0;
}
数据库中查:
但是使用查询语句不行
sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操 作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过 mysql_store_result这个函数来读取结果。原型如下:
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该 函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内 存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行 完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取 MYSQL_RES 中的数据。
对于MYSQL_RES类型:
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。
#include <iostream>
#include <mysql/mysql.h>
#include <string>
const std::string host = "127.0.0.1";
const std::string passwd = "123456";
const std::string db = "test";
const std::string user = "lwz";
const unsigned int port = 3306;
int main()
{
// std::cout << "mysql client Version: " << mysql_get_client_info() << std::endl;
// 1. 创建句柄
MYSQL *mysql = mysql_init(nullptr);
if (mysql == nullptr)
{
std::cout << "mysql_init error" << std::endl;
return 1;
}
// 2.链接数据库
if (mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
std::cout << "connect error" << std::endl;
return 2;
}
std::cout << "connect success" << std::endl;
// 3.设置字符集
mysql_set_character_set(mysql, "utf8");
// 4.执行命令,对select特殊处理
std::string sql = "select * from user";
int n = mysql_query(mysql, sql.c_str());
if (n == 0)
{
std::cout << sql << " success " << n << std::endl;
}
else
{
std::cout << sql << " error " << n << std::endl;
return 3;
}
// 4.1拿到结果集
MYSQL_RES* res = mysql_store_result(mysql);
if(res == nullptr)
{
std::cout << "mysql result error" << std::endl;
return 4;
}
// 4.2 获取行和列,方便后面遍历
int rows = mysql_num_rows(res);
int fields = mysql_num_fields(res);
// 4.3 从结果集中拿到每一行的数据
MYSQL_ROW line;
for(int i = 0;i < rows;i++)
{
line = mysql_fetch_row(res);
for(int j = 0;j < fields;j++)
{
std::cout << line[j] << " ";
}
std::cout <<std::endl;
}
mysql_free_result(res);
mysql_close(mysql);
return 0;
}
四. 图形化界面登陆数据库
主要就注意这个3306端口监听所有网络接口:
还有我们创建的用户一定要是全部的都可以链接,可以远程登录,虽然不安全:
这里我比较常用MySQL workbench(免费)和navicat(收费)
因为不太安全,不用的时候一定要关闭数据库,或者删除
更多推荐
所有评论(0)