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 collation 和类似错误的 Stack Overflow 线程,但我仍然无法理解为什么我的变量没有像我预期的那样工作。
语法不允许 in (@campaigns)
,其中 @campaigns
是项目的共性。您基本上要求的是一根长字符串,而不是您希望的两根。我认为没有办法做你想做的事(将 @variable
设置为列表,然后在 IN
中使用它。)
要调查您收到排序规则错误的原因,请提供
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'coll%';
我在 .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 collation 和类似错误的 Stack Overflow 线程,但我仍然无法理解为什么我的变量没有像我预期的那样工作。
语法不允许 in (@campaigns)
,其中 @campaigns
是项目的共性。您基本上要求的是一根长字符串,而不是您希望的两根。我认为没有办法做你想做的事(将 @variable
设置为列表,然后在 IN
中使用它。)
要调查您收到排序规则错误的原因,请提供
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'coll%';