非法混合排序(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)

时间:2017-08-10 18:35:23

标签: mysql sql

这是我的问题:

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也不起作用。

1 个答案:

答案 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;

欢呼