原因

某些项目的创建时间字段需要精确到毫秒级,该字段类型是 timestamp,参考 MySQL 5.7 官方文档0 在日期相关字段中的含义不同,如下表:

Data Type"Zero" Value
DATE"0000-00-00"
TIME"00:00:00"
DATETIME"0000-00-00 00:00:00"
TIMESTAMP"0000-00-00 00:00:00"
YEAR0000

由此,可以看到无论是 DATETIME 还是 TIMESTAMP 字段属性,默认都是精确到秒的。

查阅资料发现,可以通过 TIMESTAMP(n) 来指定精确度,实际修改中发现当前数据库版本是 5.5,执行字段类型更改时一直报错,但是在 5.7 版本中可以正常修改字段类型,后将数据库更新到 5.7 版本,emm…,迎来升级的同时,小问题也是不少。


问题及解决

mysql.user 表结构的改变

5.55.7 版本的 mysql.user 表结构不同(暂不仔细探讨),导致项目中需要连接 MySQL 数据库的地方全部认证失败 Access denied for test@192.168.53.6,但是,该表中的数据全部正常,内网全部可连接,尝试重置密码:

set password for 'test@192.168.%.%' = password('test666');

执行报错:

ERROR 1805 (HY000): Column count of mysql.user is wrong. 
Expected 42, found 49. The table is probably corrupted 

查询资料发现,是数据库升级导致的,两个版本的表结构不同,只好执行升级命令:

 mysql_upgrade -u root -p 

输入 root 密码等待执行完毕之后再更改密码,SQL 语句执行成功,再刷新权限即可:

flush privileges;

GROUP BY 问题

日志报错:

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.user.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by;

可以看到是 sql_mode=only_full_group_by 的问题,查看官方文档,发现默认的 sql_mode 中有 only_full_group_by,该配置导致 GROUP BY 后的列必须在 SELECT 的列中。

执行:

select @@sql_mode;

查看当前 sql_mode,将 only_full_group_by 删除即可。

Last modification:January 14, 2019
If you think my article is useful to you, please feel free to appreciate