MYSQL数据库各种小Tips

之前写了Linux的小Tips,觉得应该把数据库这块单独拎出来写。其实网上很多关于Mysql数据库的帖子。这边我只记录我花了很长时间才解决的,需要通过很多不同的帖子才解决的一些问题。

1. MYSQL升级后表名大小写识别问题

之前使用的是MySQL 5数据库,今天在重新搭建测试环境,使用了MySQL 8 并把数据备份导入新库。随后发现之前可以成功执行的MySQL查询语句现在不能正常工作了。于是搜索发现需要对MySQL数据库设置lower_case_table_names配置。当在/etc/my.cnf文件中配置为1时,大小写不敏感:

[mysqld]
lower_case_table_names = 1
...
...
...

然而,网上很多帖子只写了其一,没有提其二。由于,我是先导入了数据以后发现问题,随后再修改配置。然而,当修改了以上配置,发现mysqld服务就起不来了。后来在MYSQL官网上发现以下内容:

lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.

也就是说,必须在MySQL数据库初始化前配置好该参数。因此,要修改该参数,必须先备份好数据库,然后配置好参数后调用以下命令初始化数据库:

rm -rf /data/mysql/
./bin/mysqld --defaults-file=/etc/my.cnf --initialize

随后重新把备份好的数据库导入即可。

2. 关于ONLY_FULL_GROUP_BY的错误

从MYSQL 5.7开始,默认使用ONLY_FULL_GROUP_BY模式。因此使用Select和Group By搜索数据时,如果使用以前的方法就很容易报错。在百度搜索问题原因和解决方案,会发现很多重复的,而且并非很好的解决方法。所以,这里记录一下。首先在使用GROUP BY的SELECT语句中,如果碰到以下错误信息:

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mydb.t.address' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

那么恭喜你,你可以继续往下看了。按照MYSQL的官方文档, 大白话意思就是SELECT中的内容要么是能够聚合的,要么是在GROUP BY中出现的。这个聚合是什么意思呢?就是说需要使用count()函数或者sum()函数做处理的数据。例如一下搜索语句:

SELECT name, address, MAX(age) FROM t GROUP BY name;

这里面因为address,所以会报错。在这种情况下,如果需要在搜索结果中包含address数据字段,需要使用ANY_VALUE()函数,例如:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

以上问题解释和解决方案均来自于MYSQL的官方文档。到目前为止,百度搜索的结果竟然清一色的是修改MYSQL的sql_mode,把ONLY_FULL_GROUP_BY给去掉,并且重启数据库。这里吐个槽,这种解决方案真是害人,另外百度搜索做过去重检测么?大量的复制粘贴都在搜索列表里,真是浪费时间。

猜你喜欢

转载自blog.csdn.net/leojames102/article/details/81535908