【问题标题】:Illegal mix of collations in stored procedure存储过程中排序规则的非法混合
【发布时间】:2010-12-07 11:06:48
【问题描述】:

我在 MySQL 中的存储过程因Mysql::Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=' 而失败。

当在SELECT 子句中尝试将VARCHAR 列与传递给此过程的VARCHAR 参数进行比较时,该过程失败。

我表中的所有列都有utf8_unicode_ci 排序规则。数据库排序规则是相同的。我什至在 `/config/database.yml 中指定了排序规则。

但是,当我运行 /script/console 时,我设置了以下变量:

>> ActiveRecord::Base.connection.select_rows "show variables like '%colla%'"
=> [["collation_connection", "utf8_general_ci"], ["collation_database", "utf8_unicode_ci"], ["collation_server", "utf8_general_ci"]]

可能最有趣的事实是,我在同一个 MySQL 服务器上有另一个具有相同排序规则的数据库(即使从 Rails 控制台查询排序规则变量也会得到相同的结果),它运行这个存储过程没有任何问题。

感谢您的帮助。

【问题讨论】:

  • 我刚刚发现我的一个表的排序规则设置为 utf8_general_ci 设置,这在我的数据库中不正确,这就是原因。感谢您花时间回答这个问题。

标签: mysql ruby-on-rails stored-procedures


【解决方案1】:

为了快速修复,

SELECT * FROM YOUR_TABLE 
WHERE YOUR_COL=@YOUR_VARIABLES COLLATE utf8_general_ci;

SELECT * FROM YOUR_TABLE 
WHERE YOUR_COL=@YOUR_VARIABLES COLLATE unicode_ci;
/* depends on the collation for YOUR_COL */

永久修复

您可能需要使用正确/相同的排序规则重新创建数据库

【讨论】:

  • +1 感谢您的回答。您发布的链接非常有用,它们介绍了与字符集相关的手册部分中未提及(或未明确提及)的一些信息。其实,你的回答让我间接找到了真正的原因。
  • 除了@ajreal 的回答:也许很高兴知道当您使用多个语句时,所有这些都需要 COLLATE 语句。所以应该是SELECT * FROM YOUR_TABLE WHERE YOUR_COL1=@YOUR_VARIABLES1 COLLATE unicode_ci AND YOUR_COL2=@YOUR_VARIABLES2 COLLATE unicode_ci AND YOUR_COL3=@YOUR_VARIABLES3 COLLATE unicode_ci; Took me some while to figure that out.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2011-01-20
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多