mysql“非法混合排序”使用源文件中的变量

时间:2016-02-26 10:53:35

标签: mysql character collation

我在.sql文件中有以下内容:

SET @campaigns = "'9c943c24-f636-11e3-98bd-02f651afdab5','7ca1cf19-f562-11e3-98bd-02f651afdab5'";

select * from campaigns
  where id in (@campaigns);

campaigns定义为:

CREATE TABLE `campaigns` (
  `id` varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  # column defs snipped #
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

如果我通过命令行连接到我的本地MySQL实例并尝试执行上述文件:

$ mysql -h localhost -u usename -ppassword
mysql> use mydatabase;
mysql> source myfile.sql

我收到以下错误:

ERROR 1267 (HY000): Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

如果我将查询更改为(我认为),请指定排序规则:

select * from campaigns
where id COLLATE utf8_unicode_ci in (@campaigns);

回复是:

Query OK, 0 rows affected (0.00 sec) Empty set (0.00 sec)

如果我将变量内容直接放入查询中:

select * from campaigns
where id in ('9c943c24-f636-11e3-98bd-02f651afdab5','7ca1cf19-f562-11e3-98bd-02f651afdab5');

我得到了预期的两个结果。

发生了什么事?我已经阅读了几个关于mysql排序规则和类似错误的stackoverflow线程,我仍然无法理解为什么我的变量不能正常工作。

1 个答案:

答案 0 :(得分:1)

语法不允许使用in (@campaigns),其中@campaigns是项目的commalist。你基本上要求一个长串,而不是你想要的两个。我不认为有办法做你想做的事情(将@variable设置为列表,然后在IN中使用它。)

要调查您收到有关归类的错误的原因,请提供

SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'coll%';