C言語+MySQL入門|MySQLへログインする

C言語+MySQL入門|MySQLへログインする

前の記事では、MySQL Serverが接続・認証・SQL実行・データ保存を担当することを確認しました。

今回は、MySQLクライアントからサーバーへログインし、SQLを入力できる状態にしましょう。

第2章でも接続確認を行いましたが、この記事では、これからデータベースを操作していくために、接続コマンドの意味やプロンプトの読み方を詳しく確認します。

この記事では、次の内容を扱います。

  • 管理作業用のrootアカウントで接続する
  • パスワードを対話入力する方法と、直接指定する方法を確認する
  • WindowsのコマンドプロンプトとMySQLのプロンプトを区別する
  • SQLを入力して、結果を確認する
  • 入力途中のSQLを取り消す
  • MySQLクライアントを終了する

この記事の到達点は、自分でMySQLへログインし、SQLを入力して結果を確認した後、接続を終了できるようになることです。

今回は管理作業用のrootで接続する

これから、在庫管理用のデータベースやテーブル、学習用の接続ユーザーを作成していきます。

その準備を行うため、今回はMySQLの管理用アカウントであるrootを使用します。

第2章で設定した接続情報を確認しましょう。

項目今回使用する値意味
Windowsサービス名MySQL84MySQL Serverを動かすサービス
接続先127.0.0.1自分のPCで動くサーバー
ポート番号3306MySQLの通常の接続用ポート
MySQLユーザー名root管理作業に使用するアカウント
学習用パスワードpassword第2章で設定したパスワード
データベース名今回は指定しないinventory_dbは次の記事で作成する

自分の環境でポート番号やパスワードを変更した場合は、その値に読み替えてください。

管理用ユーザーとアプリ用ユーザーを分ける

rootは、データベースやユーザーなどを管理するための強い権限を持っています。

第4章で作成するCプログラムには、第3章の後半で用意する学習用の専用ユーザーを使います。

作業使用するユーザー
データベースやテーブルの準備管理用のroot
学習用ユーザーの作成と権限設定管理用のroot
第4章のCプログラムからの接続後で作成する学習用の専用ユーザー

今は、データベースを使うための準備を管理用ユーザーで行う、と考えておきましょう。

MySQL Serverが動いていることを確認する

ログインする前に、MySQL Serverが起動していることを確認します。

  1. WindowsキーとRキーを押す。
  2. 名前の欄にservices.mscを入力する。
  3. サービス管理画面でMySQL84を探す。
  4. 状態が実行中になっていることを確認する。

停止している場合は、MySQL84を右クリックし、開始を選びます。サービスの開始操作では、管理者の許可が必要になる場合があります。

サービス名を変更している場合は、自分で設定した名前を確認してください。

ここで開始できない場合は、先に第2章の起動確認へ戻りましょう。サービスの設定やエラーログに加え、必要に応じてNetworkService用の一時ディレクトリと書き込み権限も確認します。

Windowsのコマンドプロンプトを開く

今回の接続操作は、第2章と同じように、Windowsのコマンドプロンプトから行います。

スタートメニューでコマンドプロンプトを検索して起動してください。

CプログラムのコンパイルではUCRT64を使用しますが、この記事ではWindows版のmysql.exeを起動します。

作業操作する場所
サービスの起動状態を確認するWindowsのサービス管理画面
mysqlクライアントを起動するWindowsのコマンドプロンプト
接続後にSQLを入力するmysqlクライアントの画面
CプログラムをコンパイルするMSYS2 UCRT64のターミナル

同じ文字入力の画面でも、現在どのプログラムが入力を受け付けているのかを意識すると、操作しやすくなります。

MySQLのbinフォルダへ移動する

コマンドプロンプトで、次のコマンドを実行します。

cd /d "C:\Program Files\MySQL\MySQL Server 8.4\bin"

移動すると、通常は次のような表示になります。

C:\Program Files\MySQL\MySQL Server 8.4\bin>
コマンドの部分意味
cd現在の作業フォルダを変更する
/d必要に応じてドライブも変更する
C:\Program Files\MySQL\MySQL Server 8.4\binmysql.exeが配置されているフォルダ

パスには空白が含まれるため、コマンドではダブルクォーテーションで囲んでいます。

MySQLを別の場所へインストールした場合は、その場所のbinフォルダを指定してください。

なお、この移動はmysql.exeを起動しやすくするためのものです。商品データの保存場所や、接続後に使うデータベースを選択する操作ではありません。

図1:MySQLへログインするための準備

この図から分かること

接続するためには、MySQL Serverが動いている必要があります。

サービスの起動状態を確認した後、mysqlクライアントから接続先とポートを指定します。mysqlクライアントを起動することと、MySQL Serverを起動することは別の操作です。

パスワードを対話入力してログインする

まずは、接続コマンドの実行後にパスワードを入力する方法を試しましょう。

コマンドプロンプトで、次のコマンドを実行します。

mysql -h 127.0.0.1 -P 3306 -u root -p

それぞれの指定には、次の意味があります。

指定意味
mysqlMySQLクライアントを起動する
-h 127.0.0.1接続先として自分のPCを指定する
-P 3306接続するポート番号を指定する
-u rootMySQLのユーザー名を指定する
-pパスワードの入力を求める

大文字の-Pはポート、小文字の-pはパスワードです。

見た目が似ているため、入力するときは大文字と小文字を確認してください。

パスワードの入力を求められたら

コマンドを実行すると、次のように表示されます。

Enter password:

ここで、今回の学習用パスワードであるpasswordを入力し、Enterキーを押します。

入力したパスワードは、そのまま読める文字列では表示されません。画面の表示だけで入力できていないと判断せず、入力を終えたらEnterキーを押しましょう。

-pの直後に値を付けない場合は、このように対話入力になります。

mysql>が表示されたら接続できている

接続に成功すると、案内メッセージの後に、次のプロンプトが表示されます。

mysql>

プロンプトは、プログラムが入力を待っていることを知らせる目印です。

この表示になったら、MySQLクライアントがSQLなどの入力を受け付ける状態になっています。

mysql>自体を入力する必要はありません。 その右側へ、実行したいSQLを入力します。

パスワードをコマンドへ直接指定する方法

学習用の別の方法として、パスワードを接続コマンドへ直接記述することもできます。

先ほどの方法ですでに接続している場合は、mysql>で次を入力し、いったん終了してください。

exit

Windowsのコマンドプロンプトへ戻ったら、次のコマンドを実行します。

mysql -h 127.0.0.1 -P 3306 -u root -ppassword

-pとパスワードの間には、空白を入れません。

指定方法動作
-p起動後にパスワードを入力する
-ppasswordpasswordをパスワードとして渡す
--password=password長いオプション名でパスワードを渡す

-p passwordのように空白を入れると、passwordはパスワードの値ではなく、データベース名として解釈される場合があります。直接指定するときは、-ppasswordの形にそろえましょう。

コマンドへ直接記述したパスワードは、画面やコマンド履歴などに残る可能性があります。そのため、直接指定について警告が表示される場合があります。警告だけで接続失敗と判断せず、その後の表示を確認してください。

この記事では学習用の方法として両方を紹介しています。実際の運用では、十分に強いパスワードを設定し、対話入力などの方法を使います。

プロンプトを見て入力する場所を判断する

MySQLへ接続した後は、入力する内容が変わります。

Windowsのコマンドプロンプトでは、mysqlやcdなどのWindows側のコマンドを実行します。

一方、mysql>では、SELECTなどのSQLや、exitなどのMySQLクライアント用コマンドを入力します。

画面の目印入力を受け付けているもの入力する内容の例
C:\…\bin>Windowsのコマンドプロンプトmysql、cd
mysql>MySQLクライアントSELECTなどのSQL、exit
->MySQLクライアント入力途中のSQLの続き

たとえば、mysql>でcd /dから始まるコマンドを入力しても、Windowsのフォルダ移動にはなりません。

また、mysql>で接続コマンドをもう一度入力する必要もありません。新しい接続を試す場合は、いったんexitで終了してから実行します。

図2:WindowsとMySQLの入力画面を区別する

この図から分かること

接続前はWindowsのコマンドプロンプトが、接続後はMySQLクライアントが入力を受け付けます。

どちらの画面にいるのかは、プロンプトを見て確認できます。入力する場所に迷ったら、まず画面左側の目印を確認してみましょう。

短いSQLを実行してみよう

mysql>が表示されたら、短いSQLを入力してみましょう。

今回は、テーブルを用意しなくても実行できる計算を使います。SQLファイルへの保存は行わず、mysql>へ直接入力してください。

サーバーで計算して結果を取得する

次のSQLを入力し、Enterキーを押します。

SELECT 1 + 1 AS calculation_result;
実行結果の例

表示される結果は、次の内容になります。

+--------------------+
| calculation_result |
+--------------------+
|                  2 |
+--------------------+

SELECTは、値や式の結果、テーブルのデータなどを取得する命令です。

今回のSQLでは、MySQL Serverに1 + 1を計算してもらい、その結果を取得しています。

SQLの部分意味
SELECT指定した値や式の結果を取得する
1 + 1計算する式
AS calculation_result結果の列名をcalculation_resultにする
;今回の入力方法でSQLの終わりを示す

結果が表示された後、再びmysql>に戻ります。これは、次のSQLを入力できる状態になったということです。

セミコロンと改行の違いを知る

mysqlクライアントでは、通常、SQLの末尾にセミコロンを付けて実行します。

Enterキーで改行することと、SQLを完成させて実行することは別です。複数行に分けて入力した場合は、通常、末尾のセミコロンまで入力すると実行されます。

先ほどのSQLは、次のように分けて書くこともできます。

SELECT
    1 + 1 AS calculation_result;

実行結果は、1行で入力した場合と同じです。

+--------------------+
| calculation_result |
+--------------------+
|                  2 |
+--------------------+

->はSQLの続きを待っている目印

SELECTだけを入力してEnterキーを押すと、プロンプトが次のように変わります。

mysql> SELECT
    ->

->は、SQLの続きを待っていることを表します。エラーが発生したという意味ではありません。

この状態では、次の内容を入力してSQLを完成させます。

1 + 1 AS calculation_result;

なお、このコードは、直前にSELECTを入力した状態で続けて入力する内容です。最初から実行する場合は、前に示した完全なSQLを使ってください。

セミコロンを忘れた場合

たとえば、次のように末尾のセミコロンを付けずに入力したとします。

mysql> SELECT 1 + 1 AS calculation_result
    ->

この場合は、続けてセミコロンだけを入力し、Enterキーを押せば実行できます。

;

画面が止まったように見えたときも、まずプロンプトを確認しましょう。->なら、処理に時間がかかっているのではなく、入力がまだ完成していない可能性があります。

接続したアカウントを確認する

計算ができたら、今度は接続の情報を調べてみましょう。

認証されたアカウントと選択中のデータベースを表示する

mysql>で、次のSQLを実行します。

SELECT
    CURRENT_USER() AS authenticated_account,
    DATABASE() AS current_database;
実行結果の例

今回の接続では、次のような結果になります。

+-----------------------+------------------+
| authenticated_account | current_database |
+-----------------------+------------------+
| root@localhost        | NULL             |
+-----------------------+------------------+
SQLの部分確認できる内容
CURRENT_USER()この接続で認証に使われたMySQLアカウント
DATABASE()現在選択しているデータベース
AS結果に表示する列名を指定する

CURRENT_USER()の結果は、サーバー側のアカウント設定によって異なります。DATABASE()は、既定のデータベースを選択していない場合にNULLを返します。

127.0.0.1へ接続したのにlocalhostと表示される理由

接続コマンドの127.0.0.1は、通信するサーバーの接続先です。

一方、CURRENT_USER()のroot@localhostは、認証に使われたアカウントを表します。

両者は表示している対象が異なるため、文字列が完全に同じになるとは限りません。

NULLはログイン失敗ではない

今回の接続コマンドでは、データベース名を指定していません。

そのため、current_databaseがNULLでも問題ありません。サーバーへ接続できていても、作業対象のデータベースはまだ選んでいない状態です。

inventory_dbは次の記事で作成し、利用するデータベースとして選択していきます。

入力途中のSQLを取り消す

SQLを入力している途中で、最初から書き直したくなることもあります。

mysqlクライアントでは、入力途中の内容を取り消すために\cを使えます。これは、クライアントが保持している現在の入力を消去するコマンドです。

たとえば、SELECTまで入力した状態で、次のように操作します。

mysql> SELECT
    -> \c
mysql>

自分で入力するのは、SELECTと、次の行の\cです。mysql>や->は画面側が表示します。

\cを入力してEnterキーを押すと、入力途中のSQLが取り消され、新しいSQLを入力できる状態へ戻ります。

\cは、実行済みのSQLを取り消す命令ではありません。

すでに実行したデータの変更を取り消す仕組みとは、分けて考えましょう。

引用符を閉じ忘れた場合は表示が変わる

後の記事で文字列を入力するときには、引用符の閉じ忘れにも注意します。

プロンプト主な意味
mysql>新しい入力を待っている
->SQLの続きを待っている
'>シングルクォーテーションで始めた文字列が閉じられていない
">ダブルクォーテーションで始めた文字列などが閉じられていない

文字列の途中では、\cだけを入力しても文字列の一部として扱われる場合があります。その場合は、対応する引用符を閉じてから\cを入力します。

たとえば、シングルクォーテーションの閉じ忘れで'>になっている場合、入力する内容は次のとおりです。

'\c

この例では、先頭のシングルクォーテーションで文字列を閉じ、その後の\cで入力を取り消します。セミコロンを付けて実行する必要はありません。

MySQLクライアントを終了する

作業が終わったら、mysql>で次を入力します。

exit
実行結果の例
Bye

その後、Windowsのコマンドプロンプトへ戻ります。

C:\Program Files\MySQL\MySQL Server 8.4\bin>

exitは、MySQLクライアントを終了するためのコマンドです。ここでは、セミコロンを付けずに実行できます。

終了方法には、次の選択肢もあります。

入力するコマンド動作
exitMySQLクライアントを終了する
quit同じように終了する
\q短い形式で終了する

入力途中で->などが表示されている場合は、先に入力を取り消し、mysql>へ戻ってから終了すると分かりやすくなります。

クライアントを終了してもサーバーは動き続ける

exitで終了するのは、今回起動したmysqlクライアントです。

WindowsサービスのMySQL84を停止する操作ではありません。再び接続コマンドを実行すれば、起動中のMySQL Serverへログインできます。

また、ログインするたびにMySQLをインストールし直したり、サービスを登録し直したりする必要もありません。

図3:ログインからSQLの確認、終了までの流れ

この図から分かること

MySQLを操作するときは、接続し、SQLを入力し、結果を確認してから終了します。

SQLを実行するたびに接続し直す必要はありません。一つの接続で複数のSQLを順番に実行できます。

クライアントを終了した後も、MySQL Serverは別のプログラムとして動き続けます。

ログインや入力で困ったときは

接続できない場合や、入力しても反応がないように見える場合は、画面の状態から確認していきましょう。

表示・状況主に確認すること
mysqlがコマンドとして認識されないmysql.exeがあるbinフォルダへ移動したか
ERROR 2003など、接続できないエラーMySQL84の起動状態、接続先、ポート番号
ERROR 1045など、認証を拒否されるエラーユーザー名、パスワード、接続元に対応するアカウント
ERROR 1049など、データベースが見つからないエラー未作成のデータベース名を指定していないか
->が表示されたままになるSQLの末尾にセミコロンがあるか
'>や">が表示される引用符を閉じ忘れていないか
mysql>でWindowsのコマンドが使えないexitでWindowsのコマンドプロンプトへ戻る
DATABASE()がNULLになるデータベースをまだ選択していない状態か

パスワードを使ったことと、正しいことは別

認証エラーにusing password: YESと表示されることがあります。

これは、パスワードを使用して接続を試みたことを表します。入力したパスワードが正しいという意味ではありません。

今回の学習環境では、rootのパスワードとしてpasswordを使っています。大文字・小文字や入力した値を確認しましょう。

エラーが出ても、最初からやり直す必要はない

SQLの入力を間違えても、接続が維持されていれば、mysql>から修正したSQLを入力し直せます。

接続に失敗した場合は接続情報を、SQLの入力で止まった場合はプロンプトや文末を確認する、というように段階を分けると整理しやすくなります。

次はデータベースを作成する

MySQLへログインし、SQLの実行結果を確認できたら、データベースを操作する準備が整いました。

次の記事では、在庫管理アプリで使うinventory_dbを作成します。作成したデータベースを確認し、これから商品や在庫履歴のテーブルを置く場所として選択していきましょう。

Follow me!