存储过程中非法混合的排序规则

ska*_*lee 13 mysql stored-procedures ruby-on-rails

MySQL中的存储过程失败了Mysql::Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='.

当in 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"]]
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助.

ajr*_*eal 19

要快速修复,

SELECT * FROM YOUR_TABLE 
WHERE YOUR_COL=@YOUR_VARIABLES COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM YOUR_TABLE 
WHERE YOUR_COL=@YOUR_VARIABLES COLLATE unicode_ci;
/* depends on the collation for YOUR_COL */
Run Code Online (Sandbox Code Playgroud)

永久修复

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

  • 除了@ajreal的答案:也许很高兴知道,当您使用多个语句时,所有它们都需要COLLATE语句。因此它将是`SELECT * FROM YOUR_TABLE,在其中YOUR_COL1 = @ YOUR_VARIABLES1收集unicode_ci和YOUR_COL2 = @ YOUR_VARIABLES2收集unicode_ci和YOUR_COL3 = @ YOUR_VARIABLES3收集unicode_ci; 花了我一些时间来解决这个问题。` (2认同)