历史版本9 :MySQL数据连接常见问题 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

本文介绍 MySQL数据连接 中一些报错及解决方案。

2. 示例编辑

2.1 only_full_group_by 报错

2.1.1 问题描述

有些项目初期是在 MySQL5.6(以上)进行开发,后期由于某种原因升级到 MySQL5.7 之后,可能就会突然发现原来的一些 SQL 运行都报错。

例如错误代码:1301 数据集配置错误 Query:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column,如下图所示:

222

2.1.2 原因分析

从上面的错误代码我们不难看出,应该是和 SQL 的 group by 语法有关。

由于 sql_mode的only_full_group_by 模式是默认开启的,以前能正常运行的一些语法(不规范)不再被兼容导致的报错,必须严格按照 SQL 语法书写。

2.1.3 解决方案

1)在 SQL 查询语句中不需要 group by 的字段上使用 any_value() 函数。但是这种处理方法对于已经开发完成的项目好像不太现实,因为可能设置到的修改语句实在太多。

注: any_value(field) 函数允许非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)

2)在 SQL 查询语句前添加 SET GLOBAL sql_mode = ''; 把 sql_mode 的 only_full_group_by 模式关闭。

3)修改 my.cnf( Windows下是 my.ini )配置文件,删掉 only_full_group_by 这一项,如下图所示:
222

4)如果在 my.ini 中找不到 only_full_group_by 项,我们可以打开 MySQL 命令行,执行命令:select @@sql_mode 得到 sql_mode 的值,将其添加到 my.cnf 文件的配置项里面(务必删掉 only_full_group_by 这个选项,其他的都复制过去)

内容大概:sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,如下图所示:

222

注:关于 SQL_MODE 变量,5.6 以前的版本默认为空,MySQL 5.6 中默认是严格模式,在最新的 MySQL 5.7 中对它进行的可选项设置。SQL_MODE 的默认设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作。

5)重启 MySQL 服务。

2.2 tinyint 类型字段空值入库失败

2.2.1 问题描述

1)MySQL 数据库中有 tinyint 类型字段,其值只能是 0 或者 1 ,用户如果用 0 或 1 成功填报过该字段,如下图所示:

1594350877658230.png

2)再次填报该字段,选择空值提交成功后,库内的值并非是Null,而是原来的值不变,如下图所示:

1594351048863781.png

2.2.2 原因分析

下拉框如果不编辑或者只编辑不选,都不会提交空字符串,但是如果编辑了一个非空选项再编辑不选,就会发生值变化,从而提交空字符串到后台。

2.2.3 解决方案

统一将空字符串转 Null ,设计器菜单栏「模板>报表填报属性」下,设置提交条件,绑定公式if(len(B2)==0,NULL,B2)即可。

Snag_4eb6b12.png

2.3 数据预览报错

2.3.1 问题描述

数据预览时报错:can not be represented as java.sql.Date

2.3.2 解决方案

在「数据连接URL」后添加后缀:zeroDateTimeBehavior=convertToNull

2.4 incorrect string value:'xf0x9f

2.4.1 问题描述

提交mysql报错(incorrect string value:'xf0x9f ) 字符转换不正确

2.4.2 原因分析

这是因为插入的数据中带有Emoji表情或者某些特殊字符,是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

2.4.3 解决方案

改mysql的my.ini文件:

[mysqld]                                                                                                                                                                                                  
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4

重启mysql服务后就可以正常插入了

2.5 Unknown system variable 'query_cache_size'

2.5.1 问题描述

通过proxy sql代理连接mysql8.0报错Unknown system variable 'query_cache_size'

2.5.2 原因分析

proxy sql最新内置的mysql版本是5的,所以需要修改它内置的mysql版本才能连接。

2.5.3 解决方案

查看proxy sql用的驱动版本,并改成对应八版本的驱动:

查询版本语句:select * from global_variables where variable_name='mysql-server_version';

改驱动语句见下图:

1639732780624162.png

2.6 last packet sent to the server was 9 ms ago

2.6.1 问题描述

数据连接成功,查询数据预览数据集sql报错last packet sent to the server was 9 ms ago

2.6.2 原因分析

mysql连接时间限制

2.6.3 解决方案

去掉mysql连接的url后面的 ?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=fals 这些参数

2.7 wait millis 10014, active 0, maxActive 50, creating 1, createElapseMillis 20028

2.7.1 解决方案

url后面加上useSSL=false

2.8 This application has no explicit mapping for /error, so you are seeing this as a fallback

2.8.1 问题描述

使用mysql数据库的数据集查询,嵌入客户自己的平台后,报错:This application has no explicit mapping for /error, so you are seeing this as a fallback.There was an unexpected error (type=Internal Server Error, status=500).syntax error, error in :' 1=1 ${if(len(year) == 0,""," and D',expect VARIANT, actual VARIANT ${if(len(year) == 0,""," and DATE_FORMAT(tda.registerDate,'%Y') = '" +year+ "'")}

2.8.2 原因分析

检查到数据集查询语句中有,使用${if()}函数进行参数设置,但是mysql中没有这个语法

2.8.3 解决方案

换成and IF('${year}' is null or '${year}' = '', 0 = 0, t.registerDate = '${year}')