Mysql数据库常见报错解决方案
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'work_ad.api_community_pic.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mysql5.7默认没有ONLY_FULL_GROUP_BY的设定,将不允许查询字段包括非聚集列,可以使用select @@GLOBAL.sql_mode; 或者 select @@SESSION.sql_mode;查询sql_mode,结果可能是ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,only_full_group_by:使用这个就是使用和oracle一样的group 规则, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其实这个配置目前个人感觉和distinct差不多的,所以去掉就好
Cannot truncate a table referenced in a foreign key constraint
删除之前先执行 删除外键约束,truncate后开启约束
sql
SET foreign_key_checks = 0; -- 关闭
SET foreign_key_checks = 1; -- 开启
Operation CREATE USER failed for XXX
原因:可能是执行了如下操作
sql
delete from mysql.user where user ='username';
需要再执行下面命令
sql
drop user user1;
ERROR 1269 (HY000): Can't revoke all privileges for one or more of the requested users
需要加上host,例如
sql
REVOKE ALL PRIVILEGES ON *.* FROM 'testuser'@'localhost';
刷新权限
sql
flush privileges
字符校对规则问题:查询视图时报错
Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='
本地环境:mysql8.0.13
异常提示排序规则编码混乱,mysql8.0.1之后的默认COLLATE为utf8mb4_0900_ai_ci,检查视图中所包含的表发现其中一个建表时 没有设置编码,并且其他的表设置的是 CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci因此导致混乱;
查看当前数据库的默认编码:
sql
show variables where Variable_name like 'collation%';
查看各表编码:
sql
show create table ‘table_name’;
解决方案给没有设置编码的表重新设置一下:
sql
alter table table_name default character set utf8mb4 collate=utf8mb4_general_ci;
这样设置只针对表的,但是表中字段未修改:
sql
ALTER TABLE table_name convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
修改完成以后,重新创建视图
排序内存溢出问题:
SQLSTATE[HY001]: Memory allocation error: 1038 Out of sort memory, consider increasing sort buffer size
找到mysql配置文件(我的是/etc/mysql/mysql.conf.d/mysqld.cnf), 添加一行
conf
sort_buffer_size = 16M
重启数据库,报错继续加大
Incorrect key file for notes (目前使用myisam引擎)
sql
optimize table notes;
incorrect datetime value ‘0000-00-00 00:00:00‘ for column
MySQL5.7版本以上,默认设置SQL_Mode模式,在模式里有NO_ZERO_DATE,NO_ZERO_IN_DATE,存在表示系统里DATE类型字段不能有0值,如果具备系统权限那么直接修改my.ini 配置文件,找到sql_mode行,修改为如下重启mysql即可。
sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'
,在没有系统权限,我们有本地库权限情况下如何处理,我们可以使用
sql
SELECT @@sql_mode;
就可以查到当前系统的SQL_mode配置,发现配置里有NO_ZERO_DATE,NO_ZERO_IN_DATE,这时我们使用以下命令,临时设置SQLmode模式,它只对本次会话有效,如果系统刷新后就需要我们重新设置。
sql
SET @@sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';
还有办法,不需要更改系统的SQL_mode模式,可以修改表结构,即将表中的date/datetime字段临时修改为VarChar字段,
ALTER TABLE `mytemp` CHANGE `c10` `c10` VARCHAR(100) NULL
这时进行数据更新,将‘0000-00-00’ 替换为正常的日期字符串,在使用ALTER 命令修改表字段,这时表中的字段会自动转为日期类型,字段中不能有非法字符,也可以在VarChar类型时将字段设为NULL再将字段改回日期类型。经过验证此方法不会丢失字段的值。这个方法对于系统影响最小,需要的系统权限也最小。
死锁问题处理
sql
select * from information_schema.INNODB_TRX
找到trx_mysql_thread_id 然后执行sql
sql
kill <thread_id>