我在.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线程,我仍然无法理解为什么我的变量不能正常工作。
答案 0 :(得分:1)
语法不允许使用in (@campaigns)
,其中@campaigns
是项目的commalist。你基本上要求一个长串,而不是你想要的两个。我不认为有办法做你想做的事情(将@variable
设置为列表,然后在IN
中使用它。)
要调查您收到有关归类的错误的原因,请提供
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'coll%';