异常收集( 六 ) com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

本文详细解析了在MySQL 5.7.5及更高版本中遇到的ONLY_FULL_GROUP_BY异常,通过调整SQL语句中的GROUP BY子句,成功解决了线上环境中因默认设置引发的数据查询问题。

首先,这个异常是数据SQL语法异常

先上异常截图:

{"msg":"服务器出现未知错误,请联系管理员!","data":"org.springframework.jdbc.BadSqlGrammarException: 
\n### Error querying database.  Cause: 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 

Expression 
#1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cmis.sys_clock_in.id_' which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by\n### 
The error may exist in class path resource [mybatis/SysClockInMapper.xml]\n### The error may involve com.sinosoft.sys.mapper.SysClockInMapper.getMonitorList-Inline\n### 
The error occurred while setting parameters\n### SQL: 
select count(0) from (select         id_ as 'id',         user_id_ as 'userId',         user_name_ as 'userName',         org_id_ as 'orgId',         org_name_ as 'orgName',         clock_time_ as 'clockTime',         clock_type_ as 'clockType'         from sys_clock_in         where         TO_DAYS( clock_time_ ) = TO_DAYS( NOW( ) )                             GROUP BY user_id_,org_id_         HAVING count( user_id_ ) = 1) tmp_count

\n### Cause: 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
Expression
 #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cmis.sys_clock_in.id_' which is not functionally dependent on columns in GROUP BY clause; 
 this is incompatible with sql_mode=only_full_group_by
 ; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
 Expression
 #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cmis.sys_clock_in.id_' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by\n\tat org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:93)\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)\n\tat org.springframework.jdbc.support.AbstractFallbackSQLException

出现这个异常是以为今天同事提出的, 本地执行SQL没有问题,但是在线上就报错,查了mysql版本都是5.7的.

sql语句如下

SELECT
	count( 0 ) 
FROM
	(
	SELECT
		id_ AS 'id',
		user_id_ AS 'userId',
		user_name_ AS 'userName',
		org_id_ AS 'orgId',
		org_name_ AS 'orgName',
		clock_time_ AS 'clockTime',
		clock_type_ AS 'clockType' 
	FROM
		sys_clock_in 
	WHERE
		TO_DAYS( clock_time_ ) = TO_DAYS( NOW( ) ) 
	GROUP BY
		user_id_,
		org_id_ 
	HAVING
	count( user_id_ ) = 1 
	) tmp_count

经过漫长的排查后发现在MySQL的5.7.5之后有个设置是ONLY_FULL_GROUP_BY默认是开启状态.

默认的sql-mode里的ONLY_FULL_GROUP_BY字段导致不能直接查询group_by包裹的之外的字段.

类似上面的语句聚合函数默认的参数是主键column, 这里是id_. 只需要在group by 后添加参数id_ 就行了

SELECT
	count( 0 ) 
FROM
	(
	SELECT
		id_ AS 'id',
		user_id_ AS 'userId',
		user_name_ AS 'userName',
		org_id_ AS 'orgId',
		org_name_ AS 'orgName',
		clock_time_ AS 'clockTime',
		clock_type_ AS 'clockType' 
	FROM
		sys_clock_in 
	WHERE
		TO_DAYS( clock_time_ ) = TO_DAYS( NOW( ) ) 
	GROUP BY
        <!-- 在此处添加主键字段 -->
        id_,
		user_id_,
		org_id_ 
	HAVING
	count( user_id_ ) = 1 
	) tmp_count

 

 

### 解决 `com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database` 错误 当遇到此错误时,表明应用程序尝试访问一个不存在于 MySQL 数据库服务器上的数据库。以下是几种可能的原因及解决方案: #### 验证数据库名称拼写 确认所提供的数据库名是否正确无误,注意大小写的敏感性以及任何多余的字符或斜杠的存在[^1]。 ```sql SHOW DATABASES; ``` 该命令用于显示所有可用的数据库列表,以此验证目标数据库确实存在并可被当前用户访问。 #### 检查 URL 连接字符串配置 确保 JDBC 连接 URL 中指定的目标数据库路径准确无误。对于某些框架,默认情况下可能会自动添加前导斜线 `/` 到数据库名字串之前;然而,在标准的 MySQL 协议里这并不是必需的部分,并可能导致上述提到的问题发生。因此建议移除不必要的开头斜杆以防止潜在冲突[^4]。 正确的URL格式应类似于如下所示: ```plaintext jdbc:mysql://hostname:port/databaseName?useSSL=false&serverTimezone=UTC ``` #### 用户权限设置审查 即使数据库存在于服务器上,如果没有授予适当的操作许可给执行查询指令的身份认证账户,则同样会触发类似的语法异常提示。可以通过运行下面 SQL 来查看特定用户的授权情况: ```sql SELECT * FROM information_schema.SCHEMA_PRIVILEGES WHERE GRANTEE LIKE '%username%'; ``` 必要时赋予足够的读取/修改权利以便正常操作所需资源表单数据记录项等内容[^3]。 #### 测试连接独立性 利用简单的 Java 应用程序片段测试单独建立至所期望使用的具体实例之间的链路状况良好与否。这样可以排除其他环境因素干扰诊断过程中的准确性判断依据。 ```java import java.sql.Connection; import java.sql.DriverManager; public class TestConnection { public static void main(String[] args){ String url = "jdbc:mysql://localhost:3306/test"; // 替换成实际地址 try{ Connection conn = DriverManager.getConnection(url,"root","password"); System.out.println("成功建立了与数据库 'test' 的连接!"); conn.close(); }catch(Exception e){ System.err.println(e.getMessage()); } } } ``` 通过以上方法排查定位问题根源所在之后再采取相应措施加以修正即可有效处理此类异常情形。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值