Не удается подключиться к 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, которая позволит вам продолжить разработку.