Не удается подключиться к 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 не являются опцией.

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

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/ru/set-password.html

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

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

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

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

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

В своем скрипте PHP измените функцию 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-скриптом для запуска запросов для вас:

 <?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"; ?> 

вы можете сделать эту строку в своем браузере запросов 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; 

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

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

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

 sudo port install php5-mysql -mysqlnd +mysql5 

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

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

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

Если у вас нет доступа администратора к конфигурации 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 в PHP 5.3 (проблема обратной совместимости, зарегистрированная на 7-й странице этой страницы из документации PHP: http://www.php.net/manual/en /migration53.incompatible.php ).

ЕСЛИ,

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

Затем,

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

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