【发布时间】:2016-09-23 18:46:18
【问题描述】:
当 Java/Spring/Hibernate 应用程序尝试针对 mysql 数据库执行准备好的语句时,我收到以下错误消息:
Caused by: java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin1_german1_ci,COERCIBLE) for operation '='
产生这个的select语句(如tomcat日志所示)是:
SELECT s.* FROM score_items s where
s.s_score_id_l=299 and
(s.p_is_plu_b = 'F') and
isTestProduct(s.p_upc_st) = 'N' and
v_is_complete_b='T'
order by s.nc_name_st, s.p_upc_st
show table status 命令的表排序规则是:
utf8_general_ci
所有 char、varchar 和 text 字段的排序规则是“utf8_general_ci”。 bigint、int 和 datetime 字段为 null。
数据库排序规则为latin1_swedish_ci,如命令所示:
show variables like "collation_database";
编辑:我能够使用 Eclipse/STS 和 Tomcat 6 实例从本地机器上成功运行它。本地进程正在从与生成错误的生产服务器上的进程相同的数据库中读取。发生错误的服务器是 Tomcat 7。实例是 Amazon Linux 服务器。
编辑 2:当我从 QA 环境运行报告时,我也能够成功运行报告,server.xml 中的 JDBC 语句重置为指向生产数据库。 QA 本质上是生产环境的镜像,正在进行一些开发工作。我还应该注意,我在上个月看到了一个类似的错误,但是当我重新运行报告时它就消失了。最后,我不确定为什么它会有所作为,但是要查询的表很大,有超过 700 万行,每行可能有 100 个字段。
编辑 3:基于 Shadow 的 cmets,我发现在测试函数中指定了字符集“latin1”。我已将其更改为 utf8 并希望这可以解决问题。
我如何知道哪个字段是“latin1_german1_ci”?
当表和字段为“utf8_general_ci”或为空时,为什么使用“latin1_swedish_ci”进行比较?
问题是否与函数字符集有关,如果是,我如何确定它使用的是哪个字符集/排序规则?
如何缩小导致问题的字段/功能?
【问题讨论】:
标签: java mysql hibernate utf-8 collation