mysql コマンドは接続先が localhost だとポート番号を指定できない

ちょっとしたWebサービスを作っていて、開発用に MySQL のサーバーを docker-compose で立てた。

その際、開発用のマシンの中ですでに MySQL が動いていて(なんで入れたのかは覚えてない)、ポート番号3306が使われていたので、適当に3307にした。

その後、以下のようなコマンドでログインしようと試みたのだが、ログインできない。

mysql -h localhost -P 3307 -u testuser -p

パスワードが間違っているのか、権限付与ができていないのか、色々な可能性を探ったが、sudo で無理やり入ってみると、どうやら3306の方に繋ぎに行っていることがわかった。

調べてみるとホスト名に localhost を指定した場合は -P オプションが効かなくなるらしい。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 4.2.4 コマンドオプションを使用した MySQL Server への接続
たとえば、Unix 上の --host=localhost では、TCP/IP のポート番号を指定するために --port または -P オプションが指定されている場合でも、クライアントは Unix ソケットファイルを使用してローカルサーバーへの接続を試みます。

localhost の場合はポート番号を使わないでソケットファイルを使って接続しにいくらしい。なるほど。

mysql -h 127.0.0.1 -P 3307 -u testuser -p

ホスト名を 127.0.0.1 に置き換えれば接続することが出来た。