web-dev-qa-db-ja.com

古い認証を使用してMySQL 4.1+に接続できません

http://bluesql.net でmySQLデータベースに接続しようとしていますが、接続しようとするとこのエラーが発生します。

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

私はこれを調べましたが、MySQL 4.1より前に使用されていた古いパスワードスキームに関係しています。新しいバージョンには古いパスワードを使用するオプションがありますが、私が読んだことでこの問題が発生する可能性があります。

Php 5.3を実行し、mySQLiで接続しています(新しいmysqli(...))。 bluesql.netのDBに接続するために、コードで何かできることを望んでいます。明らかに、データベースのセットアップ方法を制御していません。 PHPバージョンのダウングレードはオプションではありません。

誰にもアイデアはありますか?

67
B T

編集:これは、MySQLサーバーを制御している場合にのみ適用されます... MySQLパスワードハッシュ方式の古い方法と新しい方法

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;

UserHostを前のクエリから取得した値に置き換えます。)パスワードの長さをもう一度確認します。これは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

72
VolkerK

これらの行は、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;

注:ユーザー名とパスワード

その後、動作するはずです。私も自分で解決しました

9
Elliot Yap

OSXでは、Macgroundsを使用して、サイトグラウンドデータベースに接続するときに同じ問題に対処しました。 Sitegroundは5.0.77mm0.1-logを使用しているようですが、新しいユーザーアカウントを作成しても問題は解決しませんでした。これがやったことです

Sudo port install php5-mysql -mysqlnd +mysql5

これにより、phpが使用するmysqlドライバーがダウングレードされます。

7
Chad Skeeters

同じ問題がありましたが、クエリだけを実行しても役に立ちません。これを修正するために、次のことを行いました。

  1. My.cnfファイルでold_passwords = 0を設定します
  2. Mysqlを再起動します
  3. Rootユーザーとしてmysqlにログインします
  4. FLUSH PRIVILEGESを実行します。

MySQL Server構成への管理者アクセス権がない場合(つまり、ホスティングサービスを使用している場合)、これを機能させるための2つのオプションがあります。

1)MySQLサーバーでold_passwordsオプションをfalseに設定することを要求します

2)オプション1が発生するまでPHPを5.2.2にダウングレードします。

私が見つけることができたものから、問題はMySQLアカウントのパスワードがどのように保存されているか、「old_passwords」設定がtrueに設定されている場合にあるようです。これにより、MySQLとPHP(5.3+)の新しいバージョンの間で互換性の問題が発生します。ここでPHPは41文字のハッシュを使用して接続を試みますが、MySQLサーバーはそれでも16文字のハッシュを使用してアカウントパスワードを保存します。

この非互換性は、短いハッシュと長いハッシュの両方を許可するMySQL 4.1で使用されるハッシュ方式の変更によってもたらされました(MySQLサイトのこのページのシナリオ2: http://dev.mysql.com/ doc/refman/5.5/en/password-hashing.html )およびMySQL Native DriverのPHP 5.3(このページの箇条書き7で文書化された後方互換性の問題) PHP documentation: http://www.php.net/manual/en/migration53.incompatible.php )。

2
Robert Luman

IF

  1. 共有ホスティングを使用しており、ルートアクセス権がありません。
  2. リモートデータベースへの接続中に、上記のエラーが発生しています。つまり、localhostではありません。
  3. xamppを使用しています。
  4. また、コードはライブサーバーで正常に実行されていますが、問題はxamppを実行している開発マシンでのみ発生します。

その後、

それは 強くお勧めします あなたがインストールする xampp 1.7.0 。 リンクのダウンロード

注:これは上記の問題の解決策ではありませんが、開発を続行できるようにするFIXです。

0
MortalViews