Не удается подключиться к MySQL 4.1+, используя старую аутентификацию

Я пытаюсь подключиться к базе данных mySQL в http://bluesql.net, но когда я пытаюсь подключиться, он дает эту ошибку:

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication

Я изучил это, и это связано с какой-то старой схемой паролей, используемой до MySQL 4.1. В более новых версиях есть возможность использовать старые пароли, которые, как я прочитал, могут вызвать эту проблему.

Я запускаю php 5.3 и подключаюсь к mySQLi (новый mysqli (...)). Я надеюсь, что смогу сделать что-то в коде, чтобы подключиться к БД на bluesql.net - ясно, что я не контролирую, как их база данных настроена. Более ранние версии php не являются опцией.

У кого-нибудь есть идеи?

Ответ 1

edit: Это применимо только в том случае, если вы контролируете сервер MySQL... если вы не смотрите на метод хэширования Mysql old vs new

Сначала проверьте SQL-запрос

SHOW VARIABLES LIKE 'old_passwords'

(в клиенте командной строки MySQL HeidiSQL или любой другой внешний вид, который вам нравится), установлен ли сервер для использования старого парольной схемы по умолчанию. Если это возвращает old_passwords,Off, у вас только есть старые записи пароля в таблице user. Сервер MySQL будет использовать старую процедуру аутентификации для этих учетных записей. Вы можете просто установить новый пароль для учетной записи, и будет использоваться новая процедура.

Вы можете проверить, какая из подпрограмм будет использоваться, взглянув на таблицу mysql.user (с учетной записью, имеющей доступ к этой таблице).

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user

Это вернет 16 для учетных записей со старыми паролями и 41 для учетных записей с новыми паролями (и 0 для учетных записей без пароля вообще, вы также можете позаботиться о них).
Либо используйте инструменты управления пользователями в интерфейсе MySQL (если они есть), либо

SET PASSWORD FOR 'User'@'Host'=PASSWORD('yourpassword');
FLUSH Privileges;

(замените user и Host на значения, полученные вами из предыдущего запроса.) Затем снова проверьте длину пароля. Теперь ему должно быть 41, и ваш клиент (например, mysqlnd) должен иметь возможность подключиться к серверу.

см. также документацию по MySQL: * http://dev.mysql.com/doc/refman/5.0/en/old-client.html
* http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html
* http://dev.mysql.com/doc/refman/5.0/en/set-password.html

Ответ 2

Если у вас нет контроля над сервером

У меня была эта проблема, и мне удалось ее обойти.

Сначала подключитесь к базе данных MySQL с более старым клиентом, который не возражает против old_passwords. Подключите с помощью пользователя, который будет использоваться script.

Запустите эти запросы:

SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');

В вашем PHP script измените функцию mysql_connect, чтобы включить флаг клиента 1:

define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);

Это позволило мне успешно подключиться.

Изменить: согласно комментарий в Garland Pope, может не потребоваться вручную установить CLIENT_LONG_PASSWORD в вашем PHP-коде с PHP 5.4!

Редактировать: любезно предоставлено Антонио Бонифати, PHP script для запуска запросов для вас:

<?php const DB = [ 'host' => '...', # localhost may not work on some hosting 
    'user' => '...',
    'pwd' => '...', ]; 

if (!mysql_connect(DB['host'], DB['user'], DB['pwd'])) {
    die(mysql_error());
} if (!mysql_query($query = 'SET SESSION old_passwords=FALSE')) {
    die($query);
} if (!mysql_query($query = "SET PASSWORD = PASSWORD('" . DB['pwd'] . "')")) {
    die($query);
}

echo "Excellent, mysqli will now work"; 
?>

Ответ 3

вы можете сделать эту строку в своем браузере запросов mysql или что-то

SET old_passwords = 0;
UPDATE mysql.user SET Password = PASSWORD('testpass') WHERE User = 'testuser' limit 1;
SELECT LENGTH(Password) FROM mysql.user WHERE User = 'testuser';
FLUSH PRIVILEGES;

Примечание: ваше имя пользователя и пароль

после этого он должен работать. Я просто решил тоже.

Ответ 4

В OSX я использовал MacPorts для решения той же проблемы при подключении к моей базе данных на площадке. Siteground, похоже, использует 5.0.77mm0.1-log, но создание новой учетной записи пользователя не помогло решить эту проблему. Это то, что сделал

sudo port install php5-mysql -mysqlnd +mysql5

Это понижает драйвер mysql, который будет использовать php.

Ответ 5

Если бы одна и та же проблема, но выполнение запросов не помогло бы. Чтобы исправить это, я сделал следующее:

  • Установить old_passwords = 0 в файле my.cnf
  • Перезапустить mysql
  • Вход в mysql как пользователь root
  • Выполнить FLUSH PRIVILEGES;

Ответ 6

Если у вас нет доступа администратора к конфигурации MySQL Server (т.е. вы используете услугу хостинга), есть 2 варианта, чтобы заставить это работать:

1) Попросите установить для параметра old_passwords значение false на сервере MySQL

2) Снизьте PHP до 5.2.2 до появления варианта 1.

Из того, что я смог найти, проблема связана с тем, как хранятся пароли учетной записи MySQL, и если для параметра "old_passwords" установлено значение true. Это вызывает проблему совместимости между MySQL и более новыми версиями PHP (5.3+), где PHP пытается подключиться с использованием хэш-символа с 41 символом, но сервер MySQL по-прежнему сохраняет пароли учетных записей с использованием 16-символьного хэша.

Эта несовместимость была вызвана изменением метода хеширования, используемого в MySQL 4.1, который позволяет использовать как короткие, так и длинные длины хэша (сценарий 2 на этой странице с сайта MySQL: http://dev.mysql.com/doc/refman/5.5/en/password-hashing.html) и включение MySQL Native Driver в PHP 5.3 (проблема обратной совместимости, зарегистрированная на пуле 7 этой страницы из документации PHP: http://www.php.net/manual/en/migration53.incompatible.php).

Ответ 7

ЕСЛИ,

  • Вы используете общий хостинг и не имеете корневого доступа.
  • вы получаете указанную ошибку при подключении к удаленной базе данных, то есть: не localhost.
  • и использование Xampp.
  • и код работает нормально на реальном сервере, но проблема только на вашей машине разработки, работающей с xampp.

Тогда

Рекомендуется установить xampp 1.7.0. Ссылка для скачивания

Примечание. Это не решение вышеупомянутой проблемы, а FIX, которая позволит вам продолжить разработку.