–batchオプション

mysqlコマンドの--batch(-B)オプションは、クエリ結果の出力形式を罫線付きのテーブル形式からタブ区切り形式に変える。

対話端末でmysqlを実行すると、通常は罫線付きのテーブル形式で結果が表示される。

mysql> SELECT * FROM users;
+------+-------+
| id   | name  |
+------+-------+
|    1 | Alice |
|    2 | Bob   |
+------+-------+

--batchを指定すると、同じクエリの結果がタブ区切りで出力される。

$ mysql --batch -uroot -p testdb -e "SELECT * FROM users;"
id	name
1	Alice
2	Bob

タブ区切りの出力はシェルスクリプトでcutawkにパイプで渡して加工しやすく、他のコマンドと組み合わせて使う場合に扱いやすい。

標準出力が端末でない場合は自動的にバッチ形式になる

mysqlコマンドはリダイレクトやパイプで標準出力を接続すると、--batchを指定しなくても自動的にタブ区切り形式で出力する。

$ mysql -uroot -p testdb -e "SELECT * FROM users;" | cat
id	name
1	Alice
2	Bob

シェルスクリプトからmysqlを実行する場合はほとんどのケースで標準出力がパイプやファイルにリダイレクトされるため、--batchを明示的に指定しなくてもタブ区切りの出力が得られる。
--batchが役立つのは、対話端末に接続したままタブ区切りの出力を強制したい場合である。

デフォルトで特殊文字がエスケープされる

バッチ形式の出力では、値に含まれる改行・タブ・NUL文字・バックスラッシュがデフォルトでエスケープされる。

$ mysql --batch -uroot -p testdb -e "SELECT * FROM users;"
id	name
1	Alice
2	Bob
3	NULL
4	Line1\nLine2

id=4name列は改行を含む値Line1\nLine2を保存しているが、出力では\nの2文字にエスケープされる。改行がエスケープされる結果、1行に収まっている。
エスケープにより1レコードが必ず1行で出力されるため、行単位でパースするシェルスクリプトと相性がよい。

エスケープを無効にしたい場合は--rawを追加する。

$ mysql --batch --raw -uroot -p testdb -e "SELECT * FROM users;"
id	name
1	Alice
2	Bob
3	NULL
4	Line1
Line2

--rawを指定すると、Line1\nLine2が実際の改行のまま出力され2行にわたって表示される。

関連オプション

--batchと組み合わせてよく使われるオプションに-N-sがある。

  • -N, --skip-column-names: カラム名の見出し行を出力しない
  • -s, --silent: サイレントモード。--batchと同様にタブ区切りで出力する。複数回指定すると出力をさらに抑制できる
$ mysql --batch -N -uroot -p testdb -e "SELECT id, name FROM users WHERE id IN (1, 2);"
1	Alice
2	Bob

見出し行を含めたくないシェルスクリプトでは、--batch -Nの組み合わせをよく使う。

参考