MySQLの区切り文字(デリミタ)エラーはいつ発生する?原因と対処法を解説
MySQLの区切り文字(デリミタ)エラーが発生するタイミング
MySQLにおけるデリミタ(区切り文字)エラーは、パイプ記号(|)とセミコロン(;)を組み合わせて使用し、かつMySQL 8.0.12より古いバージョンを実行している環境で発生します。
MySQLは、パイプ(|)を1つのデリミタとして、セミコロン(;)を別のデリミタとして扱います。そのため、この2つを混同した使い方をすると、バージョンによっては正しく認識されずエラーとなるのです。
補足: 本記事ではMySQL 8.0.12を使用しています。このバージョン以降では、パイプデリミタはセミコロンと組み合わせても正常に動作します。一方、8.0.12未満のバージョンでは、同じ構文でもデリミタエラーが発生するため注意が必要です。
MySQLデリミタの動作確認
まずは、パイプとセミコロンを組み合わせたデリミタが正常に動作する例を見てみましょう。
mysql> delimiter |; mysql> create procedure getSumOfTwoNumbers() -> begin -> select 2+3 as TotalValue; -> end ; -> |; Query OK, 0 rows affected (0.17 sec) mysql> delimiter ;
次に、callコマンドを使ってストアドプロシージャを呼び出します。クエリは以下の通りです。
mysql> call getSumOfTwoNumbers();
実行結果は以下のようになります。
+------------+ | TotalValue | +------------+ | 5 | +------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
セミコロンはMySQLのデフォルトデリミタ
上記のようなパイプとセミコロンの組み合わせによるデリミタ指定は避けるべきです。なぜなら、MySQLにおいてセミコロン(;)はステートメントの終端を示すデフォルトのデリミタとして機能しているからです。複数のステートメントを含むストアドプロシージャを作成する際には、セミコロンを使って元のデリミタに復帰させるのが一般的な方法です。
デリミタ変更の具体的な手順
ここからは、実際にデリミタを変更する流れを段階的に見ていきましょう。
手順1:デリミタをパイプ(|)に変更する
デリミタをパイプに設定したい場合は、以下のクエリを実行します。
mysql> DELIMITER |
手順2:ストアドプロシージャを作成する
デリミタを変更した状態で、ストアドプロシージャを作成するクエリは以下の通りです。
mysql> DELIMITER | mysql> create procedure Demo() -> begin -> select 2*3 as TotalMultiplication; -> end ; -> | Query OK, 0 rows affected (0.12 sec)
手順3:デリミタをセミコロン(;)に戻す
作業が完了したら、忘れずにデリミタをセミコロンへ戻しておきましょう。以下のクエリを実行します。
mysql> delimiter ;
-
MySQLエラー #1046「No database selected(データベースが選択されていません)」の原因と解決方法
MySQLエラー #1046 とは MySQLでテーブルを作成する際に、使用するデータベースを選択せずに作業を始めると、「ERROR 1046 (3D000): No database selected」というエラーが発生します。この記事では、エラーが起こる原因と、具体的な解決手順をわかりやすく解説します。 エラーが発生するケース まず、以下のようにMySQLを起動します。 正しいパスワードを入力すると、上記のようなコンソール画面が開きます。この状態で、データベースを何も選択せずにテーブルを作成してみましょう。 mysql> CREATE table TblUni -> ( -
-
MySQLデータベースの保存場所を確認する方法|@@datadirでデータディレクトリを調べる
MySQLデータベースはどこに保存されるのかMySQLでデータベースを作成した際、その実体(データファイル)がどの場所に保存されているのかを確認したい場合があります。そんなときに役立つのが、システム変数「@@datadir」です。この変数を参照することで、MySQLがデータを格納しているディレクトリのパスを簡単に把握できます。@@datadirを使った保存場所の確認方法構文は以下のとおりです。非常にシンプルで、SELECT文でシステム変数を参照するだけです。SELECT @@datadir;実際にMySQLで実行してみましょう。mysql> select @@datadir;実行結果は次