COLLATION'utf8_general_ci'对于CHARACTER SET'latin1'无效 - 即使设置了utf8也是如此

时间:2015-09-29 12:45:36

标签: mysql hibernate jpa

在我们的数据库中,我们使用字符集utf8存储 everyting ,然后使用COLLATE utf8_general_ci

但是,当从一个表中查询数据时,我们总是会收到以下异常:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
    at com.mysql.jdbc.Util.getInstance(Util.java:360)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2030)
    at org.jboss.jca.adapters.jdbc.CachedPreparedStatement.executeQuery(CachedPreparedStatement.java:111)
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)
    ... 120 more

我们交叉检查了我们能想象到的一切:

SHOW VARIABLES LIKE '%char%';

character_set_client    utf8
character_set_connection    utf8
character_set_database  utf8
character_set_filesystem    binary
character_set_results   utf8
character_set_server    utf8
character_set_system    utf8

以及

SHOW VARIABLES LIKE '%collation%';

collation_connection    utf8_general_ci
collation_database  utf8_general_ci
collation_server    utf8_general_ci

另外

SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = "ourscheme" and Character_set_name <> "utf8";

(empty result)

我们确保,客户端连接使用utf-8。

我们缺乏想法。似乎正确设置了表格和列。

我们还尝试在查询中明确使用COLLATE:

...table.column COLLATE utf8_general_ci AS 'column'

如果我们将查询修改为THIS:

...table.column COLLATE latin1_general_ci AS 'column'

有效。怎么可能,mysql在每个地方都显示utf8 - 但查询失败并且仅适用于latin1排序规则?

有问题的表是在每次应用程序启动时生成的,并且明确设置了默认字符集和默认的Collat​​e。

使用完全相同的“代码”,我们再生成8个表 - 问题不存在。

任何想法?环境是:

  • Wildfly 8.1
  • MySQL 5.6.26 x64
  • Hibernate 4.3.5.Final

1 个答案:

答案 0 :(得分:4)

好的,找到原因 - 我们在QUERY中尝试COLLATE utf8_general_ci的其中一个列是实际的bigint(20) - 只关注字符串列,因为bigint(20)确实如此没有设置字符集ofc - 所以我不会预期那个异常消息。