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

目录:

1. 概述编辑

1.1 版本

Finereport 版本
11.0

1.2 应用场景

本文介绍 MySQL数据连接 中,常见的问题及排查步骤。

2. 数据乱码编辑

问题描述:

1)MySQL数据集预览时,数据乱码,日期错乱。

2)报表预览时,从MySQL数据库中取出的数据乱码。

3)通过填报向MySQL数据库中填入的数据乱码。

2.1 检查数据库字符集

原因分析:

MySQL 的字符集支持有两个方面:字符集(Character set)和排序方式(Collation)。

对于字符集的支持细化到四个层次:服务器( Server), 数据库(Database), 数据表(Table), 连接(Connection)。

默认情况下,MySQL 的字符集是 latin1(ISO_8859_1)

排查步骤:

通过以下两条命令检查 MySQL 的字符集支持

1)查看字符集:SHOW VARIABLES LIKE 'character%';

2)查看排序方式:SHOW VARIABLES LIKE 'collation_%';

解决方案:

修改 MySQL 的 my.ini 文件中的字符集键值。

default-character-set = utf8 character_set_server = utf8

修改完后,重启 MySQL 的服务

service mysql restart

使用命令查看,发现数据库编码均已改成 UTF-8。

mysql> SHOW VARIABLES LIKE 'character%';

2.2 修改数据连接URL

修改数据连接的信息。

1)数据连接的「编码」类型设置为「默认」。

2)数据连接的「数据连接URL」后加后缀,如下图所示。格式为:

jdbc:mysql://hostname:port/database?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai

其中:

  • serverTimezone=Asia/Shanghai:设置以"上海时区"为准

  • characterEncoding=utf8:编码转化

2.3 检查服务器字体

原因分析:

系统未安装中文字体,所以只能乱码

排查步骤:

  • Windows系统:查看C:\WINDOWS\Fonts文件夹下的字体。

  • Linux系统:检查/usr/share/fonts文件夹下的字体。

解决方案:

服务器字体安装请参见:服务器安装字体

3. No suitable driver found for localhost编辑

问题描述:

MySQL数据连接测试连接时,报错「No suitable driver found for localhost」。

3.1 URL格式错误

原因分析:

检查MySQL的数据连接URL格式是否为jdbc:mysql://<ip>:<port>/,若格式错误,则有可能出现该报错。

解决方案:

请参考 MySQL数据连接 修改数据连接URL格式。

3.2 驱动版本不匹配

原因分析:

工程中使用的MySQL驱动版本,与数据连接的MySQL数据库版本不匹配。

解决方案:

请参考 MySQL数据连接 获取匹配版本的驱动并上传到工程中。

4. Unknown system variable 'query_cache_size'编辑

问题描述:

MySQL数据连接测试连接时,报错「Unknown system variable 'query_cache_size'」。

原因分析:

工程中使用的MySQL驱动版本,与数据连接的MySQL数据库版本不匹配。

query_cache_size参数在MySQL 8中已经移除,它存在于5.1.44版本驱动中。

解决方案:

请参考 MySQL数据连接 获取匹配版本的驱动并上传到工程中。

5. Access denied for user编辑

问题描述:

MySQL数据连接测试连接时,报错「Access denied for user」。

原因分析:

数据库服务器拒绝了来源于这个IP的这个用户。

解决方案:

请排查数据连接中输入的用户名和密码是否正确。

请排查数据库所在服务器是否禁止工程所在服务器IP访问,请为工程所在服务器IP开启相关权限。

6. The server time zone value 'XXX' is unrecognized编辑

问题描述:

MySQL数据连接测试连接时,报错「The server time zone value 'XXX' is unrecognized」。

原因分析:

服务器的时区无法被识别或者代表不止一个时区,表示无法确定时区,需要指定。

解决方案:

修改数据连接的信息。数据连接的「数据连接URL」后加上时区参数。

格式为:&serverTimezone=UTC

7. SSL连接报错编辑

问题描述:

MySQL数据连接测试连接时,报错「Establishing SSL connection without server's identity verification is not recommended」

MySQL数据集,模板预览时数据集出错,日志报错「wait millis 10014, active 0, maxActive 50, creating 1, createElapseMillis 20028」

原因分析:

Mysql数据库的SSL连接问题,提示警告不建议使用没有带服务器身份验证的SSL连接。

解决方案:

修改数据连接的信息。数据连接的「数据连接URL」后加上ssl使用参数。

格式为:&useSSL=false

8. can not be represented as java.sql.Date编辑

问题描述:

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

解决方案:

修改数据连接的信息。数据连接的「数据连接URL」后加上参数。

格式为:zeroDateTimeBehavior=convertToNull

9. wait millis 20000, active 0, maxActive 100编辑

问题描述:

MySQL数据集,模板预览时数据集出错,日志报错「wait millis 20000, active 0, maxActive 100」。重新连接即可恢复。

解决方案:

修改数据连接的信息。数据连接的「数据连接URL」后加上参数。可根据SQL查询耗时,调大socketTimeout值。

格式为:&connectTimeout=5000&socketTimeout=5000

10. last packet sent to the server was 9 ms ago编辑

问题描述:

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

原因分析:

mysql连接时间限制

解决方案:

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

11. only_full_group_by 报错编辑

问题描述:

MySQL数据集,模板预览时数据集出错,报错「1301 数据集配置错误 Query:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column」

原因分析:

MySQL5.6版本数据库,only_full_group_by 模式是默认关闭的。

MySQL5.7之后版本数据库,only_full_group_by 模式是默认开启的。

sql_mode的only_full_group_by 模式开启,会导致一些不规范的SQL语法不再被兼容,从而出现报错。

注:only_full_group_by 模式关闭,其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作。

解决方案:

1)在 SQL 查询语句中不需要 group by 的字段上使用 any_value() 函数。any_value(field) 函数允许非分组字段的出现。

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

3)修改 my.cnf( Windows下是 my.ini )配置文件,删掉 only_full_group_by。重启 MySQL 服务。

12. 填报报错 incorrect string value编辑

问题描述:

数据填报到MySQL数据库,提交时报错「incorrect string value:'xf0x9f」

原因分析:

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

2、数据连接驱动版本不匹配。

解决方案:

1、修改mysql的my.ini文件,然后重启mysql服务。

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

2、确保数据连接驱动为帮助文档里的版本。

13. 填报空值入库失败编辑

问题描述:

数据填报空值到MySQL数据库,提交成功,但打开数据库发现空值未覆盖原有值。

原因分析:

MySQL 数据库中 tinyint 类型字段,字段值只能是 0 或者 1,不允许为空。

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

解决方案:

设置填报提交条件,将空字符串转 Null。

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

Snag_4eb6b12.png

14. Unknown system variable 'query_cache_size'

问题描述:

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

原因分析:

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

解决方案:

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

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

15. This application has no explicit mapping for /error, so you are seeing this as a fallback编辑

问题描述:

使用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+ "'")}

原因分析:

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

解决方案:

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