原因
某些项目的创建时间字段需要精确到毫秒
级,该字段类型是 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" |
YEAR | 0000 |
由此,可以看到无论是 DATETIME
还是 TIMESTAMP
字段属性,默认都是精确到秒的。
查阅资料发现,可以通过 TIMESTAMP(n)
来指定精确度,实际修改中发现当前数据库版本是 5.5
,执行字段类型更改时一直报错,但是在 5.7
版本中可以正常修改字段类型,后将数据库更新到 5.7
版本,emm…,迎来升级的同时,小问题也是不少。
问题及解决
mysql.user 表结构的改变
5.5
和 5.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
删除即可。