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

问题描述 投票:0回答:2

我的 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 控制台查询排序规则变量也会给出相同的结果),它运行此存储过程没有任何问题。

感谢您的帮助。

mysql ruby-on-rails stored-procedures
2个回答
26
投票

为了快速修复,

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 */

永久修复

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


0
投票

如果您从 MySQL 5.7 迁移到 8,存储过程变量必须以 @ 符号作为前缀,以防止出现同样的错误。

5.7 中

SELECT * FROM tablename WHERE column=stored_procedure_varchar;

可以正常工作,并且在 8.0 中也可以很好地保存,但在 8.0 中需要正确格式化,如下所示

SELECT * FROM tablename WHERE column=@stored_procedure_varchar;
© www.soinside.com 2019 - 2024. All rights reserved.