Phpmyadmin字符集致命错误“未定义索引:utf8mb3”
我安装了一个新的PHPMyAdmin实例来与MySQL8一起工作。访问主页面时,我收到一条带有以下消息的警报:Phpmyadmin字符集致命错误“未定义索引:utf8mb3”,phpmyadmin,Phpmyadmin,我安装了一个新的PHPMyAdmin实例来与MySQL8一起工作。访问主页面时,我收到一条带有以下消息的警报: Notice in ./libraries/classes/Charsets.php#154 Undefined index: utf8mb3 Backtrace ./libraries/classes/Controllers/HomeController.php#163: PhpMyAdmin\Charsets::getServerCharset(, boolean false
Notice in ./libraries/classes/Charsets.php#154
Undefined index: utf8mb3
Backtrace
./libraries/classes/Controllers/HomeController.php#163: PhpMyAdmin\Charsets::getServerCharset(,
boolean false,)
./libraries/classes/Routing.php#186: PhpMyAdmin\Controllers\HomeController->index(array)
./index.php#18: PhpMyAdmin\Routing::callControllerForRoute(
string '/',,,)
我的MySQL服务器和客户端编码是:utf8。
知道我该怎么修吗?因为
这似乎是由于在MySQL[mysqld]配置中将character_set_server设置为utf8时,MySQL 8中的一个错误造成的
各国:
MySQL立即将语句中的utf8mb3实例转换为utf8,
因此,在诸如showcreatetable或SELECT之类的语句中
从信息\u SCHEMA.COLUMNS中选择字符\u SET\u NAME或选择
排序规则\u名称从信息\u SCHEMA.COLUMNS中,用户可以看到名称
utf8或utf8\u排序规则\u子字符串
但是,查询会显示诸如“character_set_server”之类的变量;仍然返回
----------------------+----------+
| Variable_name | Value |
+----------------------+---------+
| character_set_server | utf8mb3 |
+----------------------+---------+
->utf8mb3
phpMyAdmin中代码的相关部分可以在libraries/classes/Charsets.php中找到:
phpMyAdmin在libraries/classes/Charsets.php中的getServerCharset方法中所做的导致错误的操作如下:
它检查是否已经确定了字符集。如果没有,
它使用loadCharsets方法从MySQL服务器加载可用的字符集数组。但是,这可以通过查询显示字符集来完成;或者通过查询信息或模式。在这两种情况下,都会返回utf8而不是utf8mb3,如MySQL手册中所述
然后,它通过查询SHOW变量获取服务器字符集,如“character_set_server”;这里,返回utf8mb3作为结果,如上所示
由于MySQL 5.7.8中的一个bug,我们可以忽略一个与本例无关的回退
它将结果写入变量self::$serverCharset,方法是从所有可用服务器字符集的数组中获取键为$serverCharset(utf8mb3)的数组元素。我们知道,在可用服务器字符集数组中没有键utf8mb3,只有utf8,它是utf8mb3的别名。因此,出现了错误
如何修复它
为了解决这个问题,MySQL应该在查询中返回utf8,并显示“character_set_server”等变量;,这不是我们可以轻易影响的东西,可能必须创建一个bug报告,或者我们必须在phpMyAdmin源代码中解决它
为此,我补充道
if ($serverCharset === "utf8mb3") {
$serverCharset = "utf8";
}
排队前
self::$serverCharset = self::$charsets[$serverCharset];
所以现在看起来是这样的:
/**
* Get current server charset
*
* @param DatabaseInterface $dbi DatabaseInterface instance
* @param bool $disableIs Disable use of INFORMATION_SCHEMA
*/
public static function getServerCharset(DatabaseInterface $dbi, bool $disableIs): Charset
{
if (self::$serverCharset !== null) {
return self::$serverCharset;
}
self::loadCharsets($dbi, $disableIs);
$serverCharset = $dbi->getVariable('character_set_server');
if (! is_string($serverCharset)) {// MySQL 5.7.8 fallback, issue #15614
$serverCharset = $dbi->fetchValue('SELECT @@character_set_server;');
}
if ($serverCharset === "utf8mb3") {
$serverCharset = "utf8";
}
self::$serverCharset = self::$charsets[$serverCharset];
return self::$serverCharset;
}
错误不会再发生。我们正在寻找您,请在以后将此问题报告给我们的GitHub跟踪器 见: 以下是官方的修正:
解决方案:安装phpMyAdmin 5.1.1或更新版本谢谢!它修复了致命错误。您是否计划在将来的版本中包含此修复程序?
/**
* Get current server charset
*
* @param DatabaseInterface $dbi DatabaseInterface instance
* @param bool $disableIs Disable use of INFORMATION_SCHEMA
*/
public static function getServerCharset(DatabaseInterface $dbi, bool $disableIs): Charset
{
if (self::$serverCharset !== null) {
return self::$serverCharset;
}
self::loadCharsets($dbi, $disableIs);
$serverCharset = $dbi->getVariable('character_set_server');
if (! is_string($serverCharset)) {// MySQL 5.7.8 fallback, issue #15614
$serverCharset = $dbi->fetchValue('SELECT @@character_set_server;');
}
if ($serverCharset === "utf8mb3") {
$serverCharset = "utf8";
}
self::$serverCharset = self::$charsets[$serverCharset];
return self::$serverCharset;
}