Grails中非法混合的排序规则(cp1251_general_ci,IMPLICIT)和(latin1_swedish_ci,COERCIBLE)

时间:2015-06-04 12:20:46

标签: mysql grails

我尝试在Grails中使用cp1251_general_ci编码中的MySQL(支持俄语字符)。但是当我启动我的应用程序时,p1 = figure()... p1.renderer.append(Bar(...)) p1.renderer.append(Line(...)) show(p1) 执行时,我收到此错误:

bootstrap.gsp

在MySQL中,我删除了一个旧数据库,并使用所需的编码创建了新数据库,但我仍然收到此错误。 我该怎么办才能修复它?

2 个答案:

答案 0 :(得分:2)

修复程序实际上取决于抛出错误的语句。

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

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

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

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

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

另一个修复是指定内联视图中列的字符集,例如

   SELECT l.latin1col
     FROM latin1table l
     JOIN (SELECT _latin1'utf8string' AS latin1col) s
--                ^^^^^^^ 
       ON s.latin1col = l.latin1col

要解决您的问题,您需要确定哪个表达式是哪个characterset,并在一侧或另一侧进行适当的调整。

也就是说,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;

注意:

数据库级别的字符集设置是默认值,该值应用于添加到数据库的新表,这些表没有定义字符集/排序规则。

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

发出声明来更改像这样的表格的字符集:

ALTER TABLE mytable CHARACTER SET latin1 COLLATE latin1_swedish_ci

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

答案 1 :(得分:0)

也许我很幸运,但我所做的是将所有nvarchar更改为varchar,我在000webhost服务器上得到错误,一切正常,