操作“=”时非法混合排序规则 (utf8mb4_unicode_ci,IMPLICIT) 和 (utf8mb4_general_ci,IMPLICIT)

问题描述 投票:0回答:9

我收到此错误;

操作“=”时非法混合排序规则 (utf8mb4_unicode_ci,IMPLICIT) 和 (utf8mb4_general_ci,IMPLICIT)

我将“排序规则”更改为“utf8mb4_unicode_ci”。然后表被截断,我再次重新导入行。但仍然出现同样的错误

mysql collation
9个回答
78
投票

我猜您要加入的表上有不同的排序规则。它表示您在操作中使用了非法的排序规则组合

=

所以需要设置排序规则。 例如:

WHERE tableA.field COLLATE utf8mb4_general_ci = tableB.field

然后您在

=
操作上设置了相同的排序规则。

由于您没有提供有关表格的更多信息,这是我可以提供的最好的伪代码。


25
投票

对于连接查询,我使用这段查询来解决此类错误:

select * from contacts.employees INNER JOIN contacts.sme_info  
ON employees.login COLLATE utf8mb4_unicode_ci = sme_info.login

之前使用以下查询时,我遇到了相同的错误:

select * from contacts.employees LEFT OUTER JOIN contacts.sme_info  
ON employees.login = sme_info.login

Error: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

我对排序规则了解不多,但似乎两个表都遵循不同的字符集规则。因此,等于运算符无法执行。因此,在第一个查询中,我指定了一个排序规则集来收集和组合。


13
投票

-- 这对我有用

SET collation_connection = 'utf8mb4_general_ci';
ALTER DATABASE your_bd CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

10
投票

几个小时后,我终于找到了一个对我有用的解决方案(使用 phpMyAdmin)。

请记住在执行这些操作之前先备份数据库。

  1. 登录phpMyAdmin。
  2. 从左侧列表中选择您的数据库。
  3. 单击顶部选项卡组中的“操作”。
  4. 在“排序规则”框中(靠近页面底部),从下拉菜单中选择新的排序规则。

我也查过
*更改所有表格排序规则
*更改所有表 列排序规则

我认为这不是 100% 必要的,但重新启动 mySQL/MariaDb 服务 + 断开并重新连接到数据库也是一个好主意。


补充说明: 我必须使用 utf8mb4_general_ci 因为使用 utf8mb4_unicode_ci (我本来想使用)时问题仍然存在

有关更多信息、命令行查询和插图示例,我推荐这篇文章:https://mediatemple.net/community/products/dv/204403914/default-mysql-character-set-and-collation


9
投票

charset=utf8mb4

检查连接
'dsn'       => 'mysql:dbname=DatabaseName;host=localhost;charset=utf8mb4';

4
投票

遇到了同样的问题,并通过更新字段的排序规则来修复它。

即使您更改表的排序规则,各个表字段仍然具有旧的排序规则。尝试更改表并更新那些 varchar 字段

See example here


1
投票

问题是两个表都有相同的列, 为了解决这个问题,我们需要更改表和数据库

ALTER DATABASE 数据库名称 字符集 utf8mb4 COLLATE utf8mb4_unicode_ci;

更改表 tabel1 转换为字符集 utf8mb4 整理 utf8mb4_unicode_ci;

更改表 tabel2 转换为字符集 utf8mb4 整理 utf8mb4_unicode_ci;


0
投票

首先,检查一下你的表和数据库的排序规则,如果不同就让它相似。

如果您在存储过程中遇到错误,请首先检查数据库的排序规则和进行相等操作的列,如果它们不同,请将列排序规则更改为您的数据库,然后您必须重新创建通过删除该存储过程。


0
投票

如果您正在使用触发器或者您能够删除导致错误的表 删除触发器或表并运行: 将database_name替换为您的数据库名称,并将排序规则替换为您要使用的排序规则

ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

然后再次创建触发器或您有问题的表

© www.soinside.com 2019 - 2024. All rights reserved.