普段プログラムを書く時に、
検証環境
今回はmacOS Sierra
MySQLのコメント文の書き方
MySQLでSQLに使えるコメント文は、
#
を使ってコメントを書く
#
を使ってコメントを書いてみた例が以下になります。
mysql> #コメント mysql>
この例ではSQLに関係の無い日本語をコメントとして入れていますが、#
から行末までがコメントとして扱われます。なので、
mysql> select 1 + #コメント -> 1; +---------+ | 1 + 1 | +---------+ | 2 | +---------+ 1 row in set (0.01 sec) mysql>
しかし、
--
を使ってコメントを書く
先ほどの#を使った例と同様に、--
を使ってコメントを書いてみます。
mysql> -- コメント mysql>
先ほどと同様に、
mysql> --コメント -> ;
行が継続した時と同じ表示が表示されていてコメントとして扱われていない事がわかります。一体上と下では何が違うのでしょうか。
実は、--
の後ろにスペースが入ってるか入ってないかの違いによるものです。--
は、1--1
mysql> select 1--1; +------+ | 1--1 | +------+ | 2 | +------+ 1 row in set (0.00 sec) mysql>
負の数を引く場合にコメントとして扱われてしまうとちょっと困ってしまいますね。なので、--
の後ろにスペースなどの空白文字や制御文字がある場合にのみコメントと解釈するようになってます。ちなみに、1---1
の結果は0になります。
mysql> select 1---1; +-------+ | 1---1 | +-------+ | 0 | +-------+ 1 row in set (0.00 sec)
/**/
を使ってコメントを書く
#
を使った場合、--
を使った場合のどちらも、/**/
を使ってコメントを書きます。こちらはC言語やJavaなどのように/*
から*/
で囲まれるまでの部分をコメントとして扱います。そのため、#
や--
の時は行末までがコメントとなっていましたが、/**/
では以下のように1行のSQLの途中にコメントを挟むことができます。
mysql> select 1 + /*コメント*/ 1; +--------+ | 1 + 1 | +--------+ | 2 | +--------+ 1 row in set (0.00 sec) mysql>
また以下のように複数行に渡ってコメントを入力することもできます。
mysql> select 1 + /* /*> コメント /*> コメント2 /*> */ 1; +--------+ | 1 + 1 | +--------+ | 2 | +--------+ 1 row in set (0.00 sec) mysql>
このコメントの構文には、/*!
から始まるコメントは、
mysql> SELECT 1 /*!, Point(1, 1) */; +---+---------------------------+ | 1 | Point(1, 1) | +---+---------------------------+ | 1 | �? �? | +---+---------------------------+ 1 row in set (0.00 sec)
PointはMySQLの固有の関数なので、
今回は例としてsqlite3で実行をしてみます。
sqlite> SELECT 1 , Point(1, 1); Error: no such function: Point
sqlite3にはPoint関数が無いため、
sqlite> SELECT 1 /*!, Point(1, 1) */; 1
しかし、SELECT 1;
というSQLとして扱われて問題なく動作する事がわかります。複数の種類のRDBMSを同じデータに対して用途に分けて使い分けをしたい場合などに、
またMySQLでは上記のコメント文の制御に追加でバージョンを指定することで、
今回は5./*!50720
を指定すると、
mysql> use mysql mysql> SELECT HOST /*!50720 , USER */ from user; +---------------------------------------+ | HOST | +---------------------------------------+ | % | | % | | 127.0.0.1 | | ::1 | | localhost | | localhost | | localhost | +---------------------------------------+ 7 rows in set (0.00 sec)
コメント内にあるUSERフィールドに関しては無視されていることがわかります。
では、/*!50719
に変更して実行してみましょう。
mysql> SELECT HOST /*!50719 , USER */ from user; +---------------------------------------+-----------+ | HOST | USER | +---------------------------------------+-----------+ | % | new_user | | % | test | | 127.0.0.1 | root | | ::1 | root | | localhost | | | localhost | mysql.sys | | localhost | root | +---------------------------------------+-----------+ 7 rows in set (0.00 sec)
このようにバージョン指定をしてSQLを実行させることができます。
このコメント文の使い方でよく目にするものとしては第15回 mysqldumpを使ってバックアップするで紹介したmysqldumpの出力結果などです。そこで今回はmysqlデータベースをmysqldumpで取り出してみて、
# mysqldump -uroot mysql > mysql.sql
すると以下のようなヘッダが見られます。どのような環境でmysqldumpを行ったかがわかるようなヘッダになっています。実行したOSやMySQLのバージョンが --
を使った記法で書かれていることがわかります。
-- MySQL dump 10.13 Distrib 5.7.19, for osx10.11 (x86_64) -- -- Host: localhost Database: mysql -- ------------------------------------------------------ -- Server version 5.7.19
続いて/*!
から始まるコメントが付いています。
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; …以下略…
この中で/*!40101
という文字からスタートする文字列があります。こちらは先ほど説明したとおり、/*!40101
とした場合は4.
mysqldumpのように複数のバージョンで使われることを想定したユーティリティ等を作成する際に使われることが多いです。
ログにコメントを出力する
mysqlコマンドラインクライアントでは、-c
か--comments
オプションを付けて実行してみましょう。
まずは通常ではどのような動作になるか確認してみましょう。
# mysql -uroot mysql> SET GLOBAL general_log=1; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'general_log_file'; +------------------+-------------------------+ | Variable_name | Value | +------------------+-------------------------+ | general_log_file | /Users/kk2170/query.log | +------------------+-------------------------+ 1 row in set (0.01 sec)
まずは準備としてSET GLOBAL general_
で一般ログを保存する設定を有効にします。そして、show variables
を使って一般ログファイルが何処に出力されるかを確認しました。次に簡単なSELECT文を実行してみます。
mysql> SELECT 1 + /* コメント */ 1; +--------+ | 1 + 1 | +--------+ | 2 | +--------+ 1 row in set (0.00 sec)
この時一般ログファイルに追加された行を確認してみましょう。
2017-09-15T06:59:41.778679Z 17 Query SELECT 1 + 1
となっていてコメントが保存されていないことがわかります。続いて、-c
オプションを付けて実行してみます。
# mysql -uroot -c mysql> SELECT 1 + /* コメント */ 1; +--------+ | 1 + 1 | +--------+ | 2 | +--------+ 1 row in set (0.00 sec)
この時に一般ログファイルに追加された行をみ見てみます。
2017-09-15T07:06:35.230128Z 18 Query SELECT 1 + /* コメント */ 1
今度はコメントまで保存されていることがわかります。以上のようにオプションを追加することで一般ログファイルにコメントを出力させることが出来ました。また繰り返しにはなりますが、
まとめ
今回はMySQLで使えるコメント文の紹介を行いました。適切なコメント文を適切に残していると開発時にわかりやすくなるだけではなく、