MySQL常见问题汇总
错误原因:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启。错误原因:高版本数据库(8.0)转存sql文件,并导入低版本数据库(5.7)公钥不可用,可以使用服务器提供的公钥;不会报错,但会引发SQL注入问题,该
You must reset your password using ALTER USER statement before executing this statement.
解决方法:
alter user user() identified by '26SE>Z%UddNN';
Unknown collation: ‘utf8mb4_0900_ai_ci’
错误原因:高版本数据库(8.0)转存sql文件,并导入低版本数据库(5.7)
方案一:升级MySQL数据库至高版本
方案二:将需要导入的sql文件,把其中的utf8mb4_0900_ai_ci
全部替换为utf8_general_ci
,utf8mb4
替换为utf8
this is incompatible with sql_mode=only_full_group_by
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
错误原因:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
解决方案:
- 打开
my.cnf
配置文件
vi /etc/my.cnf
- 修改模式
在[mysqld]
下面添加:
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
- 重启服务
systemctl restart mysqld
com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (10,892 > 1,024).
错误原因:MySQL的max_allowed_packet
设置过小,MySQL根据配置文件会限制server接受的数据包大小。
有时候大的插入和更新会被max_allowed_packet
参数限制掉,导致失败。
解决方案:
- 进入MySQL
mysql -uroot -p
- 查看当前配置信息
show VARIABLES like '%max_allowed_packet%';
- 设置
max_allowed_packet
set global max_allowed_packet = 2*1024*1024*10;
- 重启服务
systemctl restart mysqld
Public Key Retrieval is not allowed
错误原因:如果用户使用了sha256_password
认证,密码在传输过程中必须使用TLS
协议保护,但是如果RSA
公钥不可用,可以使用服务器提供的公钥;可以在连接中通过ServerRSAPublicKeyFile
指定服务器的RSA
公钥,或者AllowPublicKeyRetrieval=True
参数以允许客户端从服务器获取公钥;但是需要注意的是AllowPublicKeyRetrieval=True
可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启
解决方案:
allowPublicKeyRetrieval=true
jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=UTF8&allowPublicKeyRetrieval=true
查询存储的时间和存储的时间相差13个小时
- 明确指定MySQL数据库的时区,不使用引发误解的
CST
mysql> set global time_zone = '+08:00';
Query OK, 0 rows affected (0.00 sec)
mysql> set time_zone = '+08:00';
Query OK, 0 rows affected (0.00 sec)
- 修改数据库配置文件
vi /etc/my.cnf
# 添加一行
default-time-zone='+08:00'
Parameter index out of range (1 > number of parameters, which is 0)
当分页查询中带有SQL子查询
和LEFT JOIN
时,参数"#{}
"无法被解析
错误原因:SQL语句可能无法优化
-
当将
#{}
换成${}
不会报错,但会引发SQL注入问题,该方案不可取 -
不分页时,无此问题
-
RIGHT JOIN
和INNER JOIN
不会触发此问题
解决方案:通过Page
对象设置关闭优化可以解决此问题
更多推荐
所有评论(0)