deepin20 DATE下面执行mysql安装命令一般默认给的都是mysql 5.7
版本的安装,修改密码的方法已经写过,但是Ubuntu20.04默认安装的版本是8.0
mysql Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
于是当我们安装上面的办法进行安装后,会出现一直报错
所以用sudo权限进入mysql后
先看mysql是否为空
use mysql;
update user set authentication_string='' where user='root';
//--将字段置为空
alter user 'root'@'localhost' identified with mysql_native_password by '123';
//--修改密码为123
如果为空,则直接修改密码
alter user 'root'@'localhost' identified with mysql_native_password by '123';
//--修改密码为123
之后跟老版本一样
原因可以具体看这个博客
mysql建表
当时实验室要求写一个聊天室时教了教我们如何建表以及主键和外键的使用
当时有点生疏,以至于写聊天室时犯了一个比较大的错误就是表的设计
之后重写后对于mysql的主键用法有些体会
create table xxxx(xxx 变量类型(大小),xxxxx)
基本这个格式
如果加了primary key
则设置为主键,auto_increment
为自增键
如果不加任何数据类型默认为int(11)
1.account表
create table account(id int(10) primary key auto_increment,username varchar(100),password varchar(100),status int(10));
id为注册者姓名唯一标识,并设置为自增主键
status为登录者状态是否在线:1online,2downline
2.friend表
create table friend(uid int(10),fid int(10),status,request int(10))
friend表就可以设计的比较简单点,request是作为朋友申请是否通过的一个判断来完成离线请求和在线请求
status:1 PAL,2 BLACK,3 UNBLACK作为屏蔽和好友的状态判断
3.chat_message表
create table group_message(uid int(10),fid int(10),message varchar(1024),status);
status判断发送与否
4.groups表
create table groups(gid int(10),group_name varchar(20));
gid设置为了自增主键
5.group_member表
create table group_member(gid int(10),mid int(10), status int(10));
status:1 OWNER群主(建群时自动为群主)2 ADMIN群成员 3 COMMON群成员
request用来判断发送离线还是在线请求
6.group_request表
create table group_request(sid int(10),mid int(10),request int(10));
当初建表没建好,以至于要用这个来辅助完成离线群申请
7.group_message表
create table group_message(send_name int(10),recv_name int(10),message varchar(1024),status int(10),gid int(10));
同样群聊信息也比较难处理,于是增加了gid群成员和status的发送状态
stauts代表发送与否用来完成离线信息
8.file表
由于实现框架比较局限于缓冲区传输,所以文件传输有些bug目前改不出来,待以后解决
mysql的备份与恢复
1.备份
进入mysql后输入
mysqldump >chatroom.sql;
//xxxx.sql为重定向到备份路径
2.还原
mysql >source chatroom.sql;
在远程mysql内还原
关于结果集的取用
一般我们在输出mysql内数据时会经历三步
char buf[BUFSIZ];
sprintf(buf,"mysql 语句",mes.sender,mes.recver,0);
//mysql语句为你要写入的字符串
printf("buf:%s\n",buf);
ret=mysql_real_query(&mysql,buf,strlen(buf));
if(ret)
{
Mysql_with_error(&mysql);
}
MYSQL_RES *result;
MYSQL_ROW row;
result=mysql_store_result(&mysql);
row=mysql_fetch_row(result);
//取出结果集
row的返回是数组
这里要注意的是如果你是插入语句,下面的取出结果集就不需要,如果你要搜索mysql表内数据,那么取出来的结果集就取决于你的select
如果是select *
那么会取出该表所有的列
如果是select
单独的变量
那么只会取出你所要的变量所在列
关于其他
在部署公网时会出现MySQL server has gone away的出错,这要设置网络数据库的参数,所以没有解决