このセクションでは、mysql をさらに効果的に使用するテクニックを紹介します。
mysql は入力行の編集をサポートし、現在の入力行を修正したり以前の入力行を呼び出したりできます。たとえば、「左矢印」キーおよび「右矢印」キーで現在の入力行内を横方向に移動し、「上矢印」キーおよび「下矢印」キーで以前に入力した行を上下に移動できます。「バックスペース」でカーソルの前の文字を削除でき、新しい文字を入力するとカーソルの位置に挿入されます。行を入力するには、「Enter」を押します。
Windows では、編集キーシーケンスはコンソールウィンドウでコマンドの編集に関してサポートされているものと同じです。Unix では、キーシーケンスは mysql のビルドに使用された入力ライブラリ (たとえば、libedit
または readline
ライブラリ) に依存します。
libedit
ライブラリおよび readline
ライブラリのドキュメントは、オンラインで入手できます。所定の入力ライブラリで許可されるキーシーケンスのセットを変更するには、ライブラリ起動ファイルでキーバインドを定義します。これはホームディレクトリにあるファイルで、.editrc
は libedit
用、.inputrc
は readline
用です。
たとえば libedit
では、Control+W は現在のカーソル位置の前にあるものをすべて削除し、Control+U は行全体を削除します。readline
では、Control+W はカーソルの前の単語を削除し、Control+U は現在のカーソル位置の前にあるものをすべて削除します。mysql が libedit
を使用してビルドされた場合は、これら 2 つのキーに関して readline
の動作を好むユーザーは、.editrc
ファイルに次の行を置くことができます (必要に応じてファイルを作成します)。
bind "^W" ed-delete-prev-word
bind "^U" vi-kill-line-prev
現在のキーバインドのセットを表示するには、一時的に bind
のみの行を .editrc
の最後に置きます。mysql は起動時にバインドを表示します。
Windows は、コンソールからの読み取りおよび書き込みに、UTF-16LE に基づく API を提供します。MySQL 5.6.2 では、Windows の mysql クライアントはこれらの API を使用できます。5.6.3 では、Windows インストーラは MySQL メニューに MySQL command line client - Unicode
という項目を作成します。この項目は、Unicode を使用して MySQL サーバーにコンソール経由で通信するように設定されたプロパティーで mysql クライアントを呼び出します。
このサポートを手動で利用するためには、互換性のある Unicode フォントを使用するコンソール内で mysql を実行し、デフォルト文字セットをサーバーとの通信でサポートされる Unicode 文字セットに設定します。
コンソールウィンドウを開きます。
コンソールウィンドウプロパティーに移動して「フォント」タブを選択し、Lucida Console またはその他の互換性のある Unicode フォントを選択します。コンソールウィンドウはデフォルトでは Unicode に不適切な DOS ラスターフォントを使用するため、これが必要です。
mysql.exe を
--default-character-set=utf8
(またはutf8mb4
) オプションで実行します。utf16le
は接続文字セットとしてはサポートされていないため、このオプションが必要です。
これらの変更により、mysql は Windows API を使用して、UTF-16LE を使用してコンソールと通信し、サーバーとは UTF-8 を使用して通信します。(前述のメニュー項目は、フォントと文字セットを今説明したように設定します。)
mysql を起動するたびにこれらのステップを実行しなくてもいいように、mysql.exe を呼び出すショートカットを作成できます。このショートカットは、コンソールフォントを Lucida Console またはその他の互換性のある Unicode フォントに設定し、--default-character-set=utf8
(または utf8mb4
) オプションを mysql.exe に渡すようにしてください。
または、コンソールフォントの設定のみを行うショートカットを作成し、文字セットは my.ini
ファイルの [mysql]
グループで設定します。
[mysql]
default-character-set=utf8
クエリー結果の中には、縦表示の方が、通常の横向きの表形式よりもはるかに読みやすい場合があります。セミコロンの代わりに \G でクエリーを終了することで、クエリーを縦に表示できます。たとえば、多くの場合、改行を含む長いテキスト値は縦の出力の方がはるかに読みやすくなります。
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.
Yes, please do that.
Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)
初心者にとって、使いやすい起動オプションは --safe-updates
(または同じ効果のある --i-am-a-dummy
) です。これは DELETE FROM
ステートメントを発行したが、tbl_name
WHERE
句を忘れてしまった場合に役立ちます。通常、このようなステートメントはテーブルからすべての行を削除します。--safe-updates
を使用すると、行を特定するキー値を指定しないと、行を消去できません。これにより、事故を予防します。
--safe-updates
オプションを使用すると、mysql は MySQL サーバーに接続した際に次のステートメントを発行します。
SET sql_safe_updates=1, sql_select_limit=1000, max_join_size=1000000;
セクション5.1.4「サーバーシステム変数」を参照してください。
SET
ステートメントには次の効果があります。
-
UPDATE
ステートメントまたはDELETE
ステートメントは、WHERE
句にキーの制約を指定するか、LIMIT
句を提供するか (または両方) しないかぎり実行を許可されません。例:UPDATE tbl_name SET not_key_column=val WHERE key_column=val; UPDATE tbl_name SET not_key_column=val LIMIT 1;
サーバーは、ステートメントに
LIMIT
句が含まれていないかぎり、すべての大規模なSELECT
の結果を 1,000 行に制限します。サーバーは、1,000,000 を超える行の組み合わせを確認しなければいけない可能性のある、複数テーブルの
SELECT
ステートメントを中止します。
1,000 および 1,000,000 以外の制限を指定するには、--select_limit
オプションおよび --max_join_size
オプションを使用してデフォルトをオーバーライドできます。
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
ステートメントの送信中にサーバーとの接続が切断された場合、mysql クライアントはただちに自動的にサーバーに一度再接続してステートメントを再度送信しようとします。ただし、mysql が再接続に成功しても、最初の接続は終了し、前セッションのオブジェクトと設定は失われます。この中には、一時テーブル、自動コミットモード、およびユーザー定義変数やセッション変数が含まれます。また、現トランザクションはロールバックします。この動作は危険な場合があります。たとえば、次の例では、サーバーはユーザーの了解なしに、最初のステートメントと 2 番目のステートメントの間にシャットダウンして再起動させられています。
mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 1
Current database: test
Query OK, 1 row affected (1.30 sec)
mysql> SELECT * FROM t;
+------+
| a |
+------+
| NULL |
+------+
1 row in set (0.05 sec)
@a
ユーザー変数は接続とともに失われ、再接続後は未定義です。接続が失われた際に、mysql がエラーで終了することが望ましい場合、mysql クライアントを --skip-reconnect
オプションで起動できます。
自動再接続および再接続時の状態情報への影響の詳細は、セクション23.7.16「自動再接続動作の制御」を参照してください。