我尝试在Grails中以cp1251_general_ci编码(支持俄语字符)使用MySQL。但是,当我启动我的应用程序时,在执行bootstrap.gsp时,出现了以下错误:

2015-06-04 15:52:28,889 [localhost-startStop-1]
    ERROR spi.SqlExceptionHelper  - Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
    for operation '='

在MySQL中,我删除了一个旧数据库并使用所需的编码创建了新数据库,但是仍然出现此错误。
我该如何解决?

最佳答案

解决方法实际上取决于引发错误的语句。

基本上,MySQL抱怨=两侧的表达式,即字符集/排序规则不兼容。

该错误是由于要比较的两个表达式之间的字符集不匹配。

当我运行创建内联 View (派生表)的语句,并使用客户端连接的字符集创建派生表(按预期)时,通常会遇到此错误,然后在外部查询中进行相等比较到具有不兼容字符集的表中的列,例如:

   SELECT l.latin1col
     FROM latin1table l
     JOIN (SELECT 'utf8string' AS utf8col) s
       ON s.utf8col = l.latin1col

内联 View 中未指定列的字符集,因此派生表继承自character_set_connection变量。一种可能的解决方法是更改​​ session 变量的设置。 (然后,当该语句运行时,派生表中的列就是该字符集。)

另一个解决方法是在嵌入式 View 中为列指定字符集,例如
   SELECT l.latin1col
     FROM latin1table l
     JOIN (SELECT _latin1'utf8string' AS latin1col) s
--                ^^^^^^^
       ON s.latin1col = l.latin1col

要解决您的问题,您需要找出哪个表达式是哪个字符集,并在一侧或另一侧进行适当的调整。

也就是说,cp1251_general_ci归类来自客户端连接,还是来自表列。

如果在语句中使用文字,则可以使用CONVERT函数将其转换为合适的字符集/排序规则,以便与其他字符集/排序规则的列进行比较...

例如,而不是这样:
 WHERE col = 'myliteral'

您可以执行以下操作:
 WHERE col = CONVERT('myliteral' USING latin1)

-或-使用文字值,您也可以执行此操作
 WHERE col = _latin1'myliteral'

如果还需要指定排序规则,则可以在其后加上COLLATE关键字,并指定对字符集有效的排序规则:
 WHERE col = CONVERT('myliteral' USING latin1) COLLATE latin1_swedish_ci

从您的问题尚不清楚character_set_connectioncollation_connection变量设置为什么。
 SELECT @@session.character_set_connection
      , @@session.collation_connection
      , @@global.character_set_connection
      , @@global.collation

或者将数据库中字符列的字符集和排序规则设置为什么,
 SHOW CREATE TABLE mytable;

注意:

数据库级别的角色集设置是默认值,该默认值应用于已添加到数据库中且未定义角色集/排序规则的新表。

表的“默认字符集”设置是将用于将添加的未指定字符集/排序规则的新列的字符集。

发出一条语句来更改表的字符集,如下所示:
ALTER TABLE mytable CHARACTER SET latin1 COLLATE latin1_swedish_ci

不会更改表中已存在列的字符集或排序规则。它只会影响添加的未指定字符集/排序规则的新列。同样的事情也适用于ALTER DATABASE语句……对现有表和列没有任何影响,仅对创建的未指定字符集/排序规则的新表有影响。

关于mysql - Grails中的归类(cp1251_general_ci,IMPLICIT)和(latin1_swedish_ci,COERCIBLE)的非法混合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30643683/

10-12 16:43
查看更多