php mysqli_connect: метод проверки подлинности, неизвестный клиенту [caching_sha2_password]

Я использую php mysqli_connect для входа в базу данных MySQL (все на localhost)

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

это таблица mysql.user: mysql.user table

MySQL Server ini File:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

с помощью caching_sha2_password в ini файле MySQL Server невозможно вообще войти в систему с user1 или user2;

ошибка: mysqli_connect(): сервер запросил неизвестный клиенту метод аутентификации [caching_sha2_password] в...

с mysql_native_password в ini файле MySQL Server, возможно войти в систему с user1, но с user2, та же ошибка;


Как я могу войти, используя caching_sha2_password на сервере mySql?

Ответ 1

В настоящее время расширение php mysqli не поддерживает новую функцию аутентификации caching_sha2. Вы должны ждать, пока они выпустят обновление.

Ознакомьтесь с соответствующим постом от разработчиков MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Они не упомянули PDO, возможно, вам следует попытаться подключиться к PDO.

Ответ 2

Я решаю это с помощью команды SQL:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

на который ссылается https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

если вы создаете нового пользователя

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

на который ссылается https://dev.mysql.com/doc/refman/8.0/en/create-user.html

это работает для меня

Ответ 3

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Удалите кавычки (') после ALTER USER и сохраните кавычку (') после mysql_native_password BY

Это работает и для меня.

Ответ 4

Если вы используете Windows и вообще не можете использовать caching_sha2_password, вы можете сделать следующее:

  1. перезапустите установщик MySQL
  2. выберите "Reconfigure" рядом с MySQL Server (верхний элемент)
  3. нажимайте "Далее", пока не дойдете до "Метод аутентификации"
  4. измените "Использовать надежное шифрование пароля для аутентификации (РЕКОМЕНДУЕТСЯ)" на "Использовать устаревший метод аутентификации (сохранить совместимость с MySQL 5.X)
  5. Нажмите кнопку "Далее"
  6. введите пароль своей учетной записи в разделе "Учетные записи и роли" и нажмите "Проверить"
  7. Нажмите кнопку "Далее"
  8. продолжайте нажимать "Далее", пока не дойдете до "Применить конфигурацию"
  9. нажмите "Выполнить"

Установщик сделает все необходимые изменения конфигурации.

Ответ 5

Я ALTER USER 'root' @'localhost' identified with mysql_native_password BY 'root123'; следующую команду ALTER USER 'root' @'localhost' identified with mysql_native_password BY 'root123'; в командной строке и, наконец, перезапустите MySQL в локальных службах.

Ответ 6

Вы не сможете соединиться с PDO, возвращает тот же результат, что и MySQL.

Ответ 7

Это работает для меня (PHP 5.6 + PDO/MySQL Server 8.0/Windows 7 64bit)

Отредактируйте файл C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Сброс службы MySQL в Windows и в MySQL Shell...

ALTER USER [email protected]'%' IDENTIFIED WITH mysql_native_password BY 'password';

Ответ 8

Для пользователей Laravel, имеющих эту проблему с MySQL 8.0.x, добавьте

'modes'=> [
             'ONLY_FULL_GROUP_BY',
             'STRICT_TRANS_TABLES',
             'NO_ZERO_IN_DATE',
             'NO_ZERO_DATE',
             'ERROR_FOR_DIVISION_BY_ZERO',
             'NO_ENGINE_SUBSTITUTION',
            ],

в ваш файл database.php, как показано ниже:

// database.php

    'connections' => [

        'mysql' => [
            'driver'      => 'mysql',
            'host'        => env( 'DB_HOST', '127.0.0.1' ),
            'port'        => env( 'DB_PORT', '3306' ),
            'database'    => env( 'DB_DATABASE', 'forge' ),
            'username'    => env( 'DB_USERNAME', 'forge' ),
            'password'    => env( 'DB_PASSWORD', '' ),
            'unix_socket' => env( 'DB_SOCKET', '' ),
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_unicode_ci',
            'prefix'      => '',
            'strict'      => true,
            'engine'      => null,
            'modes'       => [
                'ONLY_FULL_GROUP_BY',
                'STRICT_TRANS_TABLES',
                'NO_ZERO_IN_DATE',
                'NO_ZERO_DATE',
                'ERROR_FOR_DIVISION_BY_ZERO',
                'NO_ENGINE_SUBSTITUTION',
            ],
        ],
    ],

Это исправило это для меня.

Ответ 9

Я попробовал это в Ubuntu 18.04 и это единственное решение, которое сработало для меня:

ALTER USER [email protected]'%' IDENTIFIED WITH mysql_native_password BY 'password';

Ответ 10

Я думаю, что бесполезно настраивать сервер mysql без шифрования caching_sha2_password, мы должны найти способ публиковать, отправлять или получать защищенную информацию через сеть. Как вы видите в коде ниже, я не использую переменную $ db_name, а я использую пользователя на сервере MySQL с паролем стандартной конфигурации. Просто создайте пароль пользователя Standar и настройте все привилегии. это работает, но как я сказал без секретности.

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>