MySQL "illegal mix of collations" 使用源文件中的变量

MySQL "illegal mix of collations" using variable from source file

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

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

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

Table 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 collat​​ion 和类似错误的 Stack Overflow 线程,但我仍然无法理解为什么我的变量没有像我预期的那样工作。

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

要调查您收到排序规则错误的原因,请提供

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