DISTRICT 37

なにか

MySQLの小ネタ

普段はWorkbenchとかプログラムとかからDBを扱っているので、CUIではあまり見ない。mysqlをふとした時にターミナルで見たりすると面食らう事があるので、いくつか使えそうなネタを調べた

PAGERの指定

SELECTの結果とかをPAGERで見ることが出来る。コンソールでSELECTの結果を見ると、レイアウトがグチャグチャになってしまうので、少しでも見やすくするためにPAGERを使って見る。

mysqlを始めるときに指定するやり方

mysqlを始めるときにpagerを指定して、各種結果を標準出力からpagerに渡すことが出来る

$ mysql -u username -p --pager='less -S'

mysqlモードに入った後からの指定

最初にpagerの指定を付け忘れても、後から指定、変更ができる

mysql > pager less -S

PAGERの終了

どんな結果もpagerで出るようになるのだが、逆にpagerだと見にくいと感じるもある。たとえばshow tablesとか、describe tableして結果を見ながらSQLを書こうかなと思っていてもpagerで出てしまうので、標準出力には残らない。

mysql > nopager

これでpagerの指定を解除できる

参考:

qiita.com

結果を縦で見る

\Gを付けることで結果を横から縦にすることが出来る

mysql > SELECT foo, bar from baz\G

クエリの末に\Gを書くと

|foo        |bar     |
+-----------+--------+
|hoge       |fuga    |
|hogehoge   |piyo    |

いつものこんな感じの出力が

********* 1. row **********
foo:hoge
bar:fuga
********* 2. row **********
foo:hogehoge
bar:piyo

こうなる。

JSON形式で表せたらいいなぁなんて思ったりもしたけど、今のところその機能は無い。

EDITORで編集

当然クエリなんかを書く際はエディタを使ったほうが編集しやすいに決まってる。ということでエディタを起動してクエリを編集

mysql > edit

こうすると環境変数EDITORに指定されているエディタが起動する。僕の場合はvimが起動し、クエリを書いて保存、終了。これで即クエリを実行してくれれば便利なんだけど、改めてセミコロンを打たないと実行されない。正直ちょっと使いづらいかなぁという印象。editと打つだけで直前のクエリをバッファに出してくれるのはちょっと便利。

ファイルからクエリ実行

それならばあらかじめ編集してあるファイルを使えばいいということで、ファイルからクエリを実行する方法。

mysql > source hoge.sql

パスの補完をしてくれないのがただただつらい。

shellコマンド実行

ソースから実行するにしても、そもそもどこにいるんだっけ?とカレントディレクトリを調べたい時にmysqlモードからshellコマンドを実行する事が出来る。

mysql > \! ls -la

shellコマンドが実行できるということは、俺たちのvimももちろん実行できるのでファイルの編集もへっちゃら。

mysql > \! vim hoge.sql

ただ、.bashrcとかに書いたエイリアスが効かないのが何ともいえない。とりあえずこのshellコマンドが実行できる事がわかればいろいろ捗りそう。

help

こうやって調べたことは体に刻み込まれる前に忘れてしまうものですが、まぁ、ヘルプを見たら大体出てるので忘れても思い出しやすいですね。

mysql > help
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.

For server side help, type 'help contents'

けどhelp pagerとかしてもなんも出ないので、helpに期待しすぎてもです。