“非法混合排序规则”错误与 phpMyAdmin 的库存安装

Posted

技术标签:

【中文标题】“非法混合排序规则”错误与 phpMyAdmin 的库存安装【英文标题】:"Illegal mix of collations" error with stock install of phpMyAdmin 【发布时间】:2021-07-11 20:38:40 【问题描述】:

问题

我有一个 Debian 11(测试)的库存安装,以及全新的 MariaDB (10.5.9-MariaDB-1)、phpMyAdmin (5.0.4deb2) 和 Lighttpd (1.4.59)。添加用户并登录后,单击任何数据库和权限选项卡会呈现以下错误:

#1267 - Illegal mix of collations (utf8mb4_general_ci,COERCIBLE) and (utf8mb4_unicode_ci,COERCIBLE) for operation '<>'

我的问题:

这是 Debian 在某个时候要解决的问题,但在短期内是否有全局排序规则设置来修复此错误?

“正确”的排序规则通常是一场圣战。我想要一些合理的东西,直到我可以更详细地查看排序规则为止。

更多错误详情

当您单击权限选项卡时,phpMyAdmin 本身生成的查询会发生此错误。生成错误的查询在下面重现。该查询似乎仅合并了来自 mysql 数据库的“db”表和“user”视图的数据,后者从“global_priv”中提取数据

没有对现有的 MariaDB 排序规则进行更改。 MariaDB 的内部 mysql 数据库表默认情况下似乎是一堆乱七八糟的排序规则。

表格大多是 utf8_bin,但也有一些 utf8_general_ci,甚至还有一个 latin1_swedish_ci。表中的列是类似的热混乱,一些采用表的默认排序规则,一些专门设置为 utf8_general_ci 和 utf8mb4_bin。 mysql.db 和 mysql.global_priv 都是 utf8_bin,但是 global_priv ix utf8mb4_bin 中的一列和 mysql.db 中的许多列是 utf8_general_ci。

查询生成错误:

( SELECT `User`, `Host`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`,
 `Drop_priv`, `Grant_priv`, `Index_priv`, `Alter_priv`, `References_priv`, `Create_tmp_table_priv`,
 `Lock_tables_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`,
 `Alter_routine_priv`, `Execute_priv`, `Event_priv`, `Trigger_priv`, '*' AS `Db`, 'g' AS `Type` FROM
 `mysql`.`user` WHERE NOT (`Select_priv` = 'N' AND `Insert_priv` = 'N' AND `Update_priv` = 'N' AND
 `Delete_priv` = 'N' AND `Create_priv` = 'N' AND `Drop_priv` = 'N' AND `Grant_priv` = 'N' AND
 `References_priv` = 'N' AND `Create_tmp_table_priv` = 'N' AND `Lock_tables_priv` = 'N' AND
 `Create_view_priv` = 'N' AND `Show_view_priv` = 'N' AND `Create_routine_priv` = 'N' AND
 `Alter_routine_priv` = 'N' AND `Execute_priv` = 'N' AND `Event_priv` = 'N' AND `Trigger_priv` =
 'N')) UNION ( SELECT `User`, `Host`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`,
 `Create_priv`, `Drop_priv`, `Grant_priv`, `Index_priv`, `Alter_priv`, `References_priv`,
 `Create_tmp_table_priv`, `Lock_tables_priv`, `Create_view_priv`, `Show_view_priv`,
 `Create_routine_priv`, `Alter_routine_priv`, `Execute_priv`, `Event_priv`, `Trigger_priv`, `Db`,
 'd' AS `Type` FROM `mysql`.`db` WHERE 'phpmyadmin' LIKE `Db`     AND NOT (`Select_priv` = 'N' AND
 `Insert_priv` = 'N' AND `Update_priv` = 'N' AND `Delete_priv` = 'N' AND `Create_priv` = 'N' AND
 `Drop_priv` = 'N' AND `Grant_priv` = 'N' AND `References_priv` = 'N' AND `Create_tmp_table_priv` =
 'N' AND `Lock_tables_priv` = 'N' AND `Create_view_priv` = 'N' AND `Show_view_priv` = 'N' AND
 `Create_routine_priv` = 'N' AND `Alter_routine_priv` = 'N' AND `Execute_priv` = 'N' AND
 `Event_priv` = 'N' AND `Trigger_priv` = 'N')) ORDER BY `User` ASC, `Host` ASC, `Db` ASC;

【问题讨论】:

【参考方案1】:

这个问题是由 phpMyAdmin 的默认 collat​​ion_connection 设置是“utfmb4_unicode_ci”引起的,而 Debian 的默认 MariaDB 服务器排序是“utfmb4_general_ci”。不幸的是,unicode 和一般排序顺序在 MariaDB 查询和视图中不兼容。

每个登录 phpMyAdmin 的新用户都需要将 phpMyAdmin 主菜单中的连接排序规则更改为与 utfmb4_general_ci 兼容的内容。

【讨论】:

【参考方案2】:

由于 Debian MariaDB 上的排序规则不同,只需重新创建 mysql.user 视图。

【讨论】:

以上是关于“非法混合排序规则”错误与 phpMyAdmin 的库存安装的主要内容,如果未能解决你的问题,请参考以下文章

MySql 中的非法混合排序规则错误

当所有排序规则都已经标准化时,Mysql 非法混合排序规则

MySQL 非法混合排序规则

如何解决“非法混合排序规则”SQLException?

在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则

使用 Ignited-Datatables 搜索时非法混合排序规则以进行“like”操作