Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phpmyadmin字符集致命错误“未定义索引:utf8mb3”_Phpmyadmin - Fatal编程技术网

Phpmyadmin字符集致命错误“未定义索引:utf8mb3”

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

我安装了一个新的PHPMyAdmin实例来与MySQL8一起工作。访问主页面时,我收到一条带有以下消息的警报:

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;
}