这是我的问题:
INSERT INTO location_province(name, country)
SELECT child.name
,location_country.id
FROM location_1 child
INNER JOIN location_1 parent
ON child.parent_id = parent.id
INNER JOIN location_country
ON location_country.name = parent.name
WHERE child.location_type = 1
它抛出了这个错误:
#1267 - 操作的非法混合(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)' ='
出了什么问题,我该如何解决?
注意:在查询结尾添加COLLATE utf8_unicode_ci
也不起作用。
答案 0 :(得分:1)
“运算符=”的排序规则的非法混合...异常是由where子句中的文本列(例如VARCHAR类型)引起的。为了演示该问题,请尝试创建两个具有不同排序规则的相同表,然后将它们联接:
create table t1_gen (label varchar(10) collate utf8_general_ci);
insert into t1_gen values ('foobar');
create table t2_uni (label varchar(10) collate utf8_unicode_ci);
insert into t2_uni values ('foobar');
,这是将导致完全相同的异常的联接。两列的排序规则确实不匹配:
select * from t1_gen, t2_uni where t1_gen.label = t2_uni.label;
如果更改where子句中字段的顺序,则异常将更改。
select * from t1_gen, t2_uni where t2_uni.label = t1_gen.label;
为使此查询有效,我们将排序规则显式添加到where子句中不匹配的列:
select * from t1_gen, t2_uni where t1_gen.label collate utf8_unicode_ci = t2_uni.label;
欢呼