Mysql里使用OUTER JOIN报错

延续 https://brucewayne2099.github.io/2021/02/19/Mysql的强制类型转换导致全表扫描/ 一文的表,再创建一个表:

1
2
3
4
5
CREATE TABLE IF NOT EXISTS `type`(
`tid` INT UNSIGNED AUTO_INCREMENT,
`typename` VARCHAR(100) NOT NULL,
PRIMARY KEY ( `tid` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

再加上一些数据:INSERT INTO type (typename) VALUES ("good"), ("Bad"), ("Excellent");。此时里面数据如下:

使用一下SELECT article.aid,article.title,user.username,type.typename FROM article INNER JOIN user ON article.uid=user.uid INNER JOIN type ON article.tid=type.tid;,效果如图:

那再试试outer join,发现有报错:

明明说inner join A和B获得的是A和B的交集(intersect),outer join A和B获得的是A和B的并集(union),为啥会报错?

答案是免费版的mysql不支持,只有企业版才支持。那既然普通的MySQL看来是不支持full outer join的了,可以这么处理:

1
2
3
select article.aid,article.title,article.content,user.username from `article` left join `user` on article.uid=user.uid 
union
select article.aid,article.title,article.content,user.username from `article` right join `user` on article.tid=user.uid;

效果如图:

Mysql8远程链接的问题

登进MySQL在命令行如下操作:

1
2
3
4
mysql>use mysql
mysql>update user set host='%' where user ='root'; #'%'表示允许外部访问
mysql>FLUSH PRIVILEGES; #将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里,不重启MySQL直接生效
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;

然后Navicat就可以通过账户密码访问了。

如果Navicat爆出mysql_native_password这个错误,那就是要改一下root加密方式从caching_sha2_password修改成mysql_native_password:

1
update user set plugin='mysql_native_password' where user='root';

这样再去Navicat试试吧。

mysql启动失败的排查方法

机器原来用的是mysql8,但是发现还是用回mysql 5.7比较好,于是就卸载了mysql 8,安装了5.7。但是启动的时候,发现失败,使用mysql --help | grep my.cnf找到my.cnf的地址,然后在my.cnf里找log-error,发现对应的mysql错误日志路径,如图:

打开日志后发现启动失败的原因是这样一句话:[ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!

找到问题了,InnoDB的问题。原来安装的是mysql8.0版本,比现在的5.7版本要高,但在高版本数据库时创建的一些数据库数据都还在,使用的是高版本的InnoDB引擎,而低版本的数据库服务还是指向了这些数据,但是一些版本的数据格式不同,这个时候,我们只要把高版本的数据删掉就可以了,删掉后重新启动mysql就可以了。

删除高版本数据库时创建的数据,不是仅仅删除创建的一些数据库,而是把整个mysql的数据目录全部删除。语句是:sudo rm -rf /var/lib/mysql/*,然后systemctl start mysqldsystemctl enable mysqld就OK了。

Royal tsx启动失败和自动断开的问题

前几天过年没啥事,就手动把macos升级成了Big Sur,结果发现终端连接工具royal tsx就无法启动了。众所周知,Xshell是没有macos版的,很多人也直接用macos的终端来远程连接服务器,但是我还是喜欢有一个终端管理工具,当时就选择了royal tax,这更新了底层系统,应用启动失败,我就懵逼了。查了一圈,发现https://www.royalapps.com/blog/royal-tsx-and-macos-11-big-sur 里有说明,需要下载符合Big Sur的royal tax才可以。我下载的是5.0.0.7,果然,更新之后,问题解决了。

补充一下,如果用Royal Tsx做文件传输,那么就直接用他的file Transfer即可,方式用的是SFTP,22端口的那个,不要用FTP。

Royal rsx默认闲置一会就自动断开,这点很讨厌。可以这么改:在对应的回话Connections点击右键,选择Properties,左侧菜单栏选择Advanced,然后点击Session,如图配置即可:

这里取消了“当session结束不自动关闭窗口”,同时设置闲置的时候发送一个ascii码来拒绝断开操作。

参考资料

https://www.cnblogs.com/lyhabc/p/3378753.html
https://blog.csdn.net/h996666/article/details/80921913
https://blog.csdn.net/qq_35456045/article/details/105554783
https://juejin.cn/post/6844904069786517517#heading-1 (centos8安装mysql5.7看这个就行)

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------