归类 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合

Posted

技术标签:

【中文标题】归类 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合【英文标题】:Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) 【发布时间】:2018-01-19 03:26:56 【问题描述】:

这是我的查询:

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】:

是的,这是因为 JOIN ON 子句和每个错误,ON 条件中涉及的那些列的排序规则不匹配。这些列的排序规则必须匹配。我的意思是下面几行

ON child.parent_id = parent.id  ------ 1
 INNER JOIN location_country
    ON location_country.name = parent.name ------ 2

检查您要加入的表并验证是否相同

好吧,在加入时更改排序规则

 INNER JOIN location_country
    ON location_country.name collate utf8_general_ci = parent.name collate utf8_general_ci 

【讨论】:

Sooo 解决方案是使两个表具有相同的排序规则;理想情况下utf8mb4_unicode_ci 仍然是同样的错误...我为所有表设置了排序规则utf8mb4_unicode_ci。有什么想法吗? 注意到location_1 表是MyISAM,我将其更改为InnoDB,就像其他表一样。 错误改了:#1253 - COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1' @MartinAJ,将排序规则改为utf8_general_ci【参考方案2】:

"Illegal mix of collat​​ion ... for operator =" 异常是由 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;

干杯,

【讨论】:

以上是关于归类 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合的主要内容,如果未能解决你的问题,请参考以下文章

“utf8_unicode_ci”和“utf8_unicode_520_ci”有啥区别

mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]