我尝试在 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_connection
和 collation_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/