多すぎるフィールドを返すMySQL SELECTをターミナルで最もよく表示する方法は?


271

私はPuTTYを使用して実行しています:

mysql> SELECT * FROM sometable;

sometableには多くのフィールドがあり、その結果、端末に表示しようとする列が多くなります。フィールドは次の行に折り返されるため、列のタイトルとフィールド値を合わせるのは非常に困難です。

端末でそのようなデータを表示するためのソリューションはありますか?

phpMyAdminやその他のGUIインターフェースにアクセスしたくありません。このようなコマンドラインソリューションを探しています。MySQLクエリの結果をテキストまたはCVSファイルに保存します。


解決策は、開発者が1つの画面よりも広い端末を拡張できないというバグを修正することです。
フクロウ

@フクロウ、これは本当にバグですか?ここで提供されるソリューションはまだ問題を解決していませんか?
ガチド

回答:


532

\G 代わりにで クエリを終了します;。例えば:

SELECT * FROM sometable\G

このクエリは、次のように行を垂直に表示します。

*************************** 1. row ***************************
                 Host: localhost
                   Db: mydatabase1
                 User: myuser1
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
*************************** 2. row ***************************
                 Host: localhost
                   Db: mydatabase2
                 User: myuser2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...

9
Windowsでは大文字と小文字が区別されませGんが、大文字にする必要があります。
Rafael Barros、

3
上記のコメントを明確にするために、入力SELECT * FROM sometable\Gするときに文字列をWindowsではなくmysqlコマンドラインクライアントに送信しているため、G大文字と小文字が区別されます
Hurricane Hamilton

2
ただし、大量のレコードではうまく機能しません。
BłażejMichalik

1
リンクされたドキュメントには、「ego(\ G)コマンドをmysqlサーバーに送信し、結果を垂直方向に表示します。他の単語内で発生する可能性のある区切り文字を定義する場合は注意してください。たとえば、区切り文字をXとして定義すると、ステートメントでINDEXという単語を使用してください。」
ベンジャミン

私はこれに遭遇しました。修正方法を教えていただけますか?sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang 2017

347

これは便利な場合もあります(Windows以外のみ)。

mysql> pager less -SFX
mysql> SELECT * FROM sometable;

これは、lessコマンドラインツールを介して出力をパイプし、これらのパラメーターを使用して、カーソルキーで水平および垂直にスクロールできる表形式の出力を提供します。

qキーを押してこのビューを離れると、lessツールが終了します。


23
これは天才です。優れた先端。時間の明けから、私はこれが欲しかった。
リチャードH

60
nopagerを使用してリセットできます。
epeleg、2011年

3
lessでの検索は、ヒット/して検索文字列を書くことで行われます。検索文字列は正規表現にすることもでき、Enterキーを押します。を押して前方に検索し、()を押しnて後方に検索します。NShift + n
Krøllebølle

5
lessさらにクールなことができます。を使用&すると、正規表現を使用して結果をフィルタリングできます(一致する行のみを表示)。これは、/検索に加えて機能します(それでも強調表示が発生します)。&もう一度ヒットしてからReturnキーを押すだけでフィルターをリセットします。
Daniel Schneller、2015年

3
出力がすでに画面に収まっている場合、Fはすぐに終了しません。Xは、終了時に画面をクリアしようとすることを防ぐためのものです。lessのmanページを参照してください。
Daniel Schneller、2016年

46

次の\G代わりにを使用してクエリを実行し、垂直モードを有効にしてみてください;

mysql> SELECT * FROM sometable \G

結果は垂直モードでリストされるため、各列の値は別々の行に出力されます。出力は狭くなりますが、明らかにはるかに長くなります。


2
を補完するものとして\G、あなたは\gの代わりとして使用することもできますが;、誰がそうするのでしょうか\G
サンティアゴアリズティ2018

25

mysqlegoコマンドを使用する

mysqlhelpコマンドから:

ego(\ G)mysqlサーバーにコマンドを送信し、結果を垂直に表示します。

だから、追加することによって\G、あなたにselect、あなたは非常にクリーンな垂直出力を得ることができます:

mysql> SELECT * FROM sometable \G

ポケットベルの使用

MySQLに、幅の広い線を切り取って矢印キーでスクロールできる出力を提供するオプションを指定lessしてページャーを使用するように指示-Sできます。

mysql> pager less -S

したがって、次にワイド出力でコマンドを実行すると、MySQLではlessページャーで出力を参照できます。

mysql> SELECT * FROM sometable;

ページャーを使い終わって、の通常の出力に戻りたい場合はstdout、次のようにします。

mysql> nopager

2
この!美しく、これをより完璧にする唯一の方法は、列が水平に伸びている距離を確認する方法を持つことです。スクロールバーのようです。それにもかかわらず、素晴らしいソリューションです。
ブランドンベネフィールド2018年

24

--tableor -tオプションを使用すると、見栄えの良い結果セットが出力されます

echo 'desc table_name' | mysql -uroot database -t

または、mysqlにクエリを渡すための他のいくつかのメソッド、たとえば:

mysql -uroot table_name --table < /tmp/somequery.sql

出力:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| username     | varchar(30)  | NO   | UNI | NULL    |                |
| first_name   | varchar(30)  | NO   |     | NULL    |                |
| last_name    | varchar(30)  | NO   |     | NULL    |                |
| email        | varchar(75)  | NO   |     | NULL    |                |
| password     | varchar(128) | NO   |     | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |
| last_login   | datetime     | NO   |     | NULL    |                |
| date_joined  | datetime     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

8

デフォルトのポケットベルはstdoutです。stdoutには列の制限があるため、出力はラップされます。他のツールをページャーとして設定して、出力をフォーマットできます。2つの方法があります。1つは列を制限することで、もう1つはvimで処理することです。

最初の方法:

  ~  echo $COLUMNS
179

mysql> nopager
PAGER set to stdout
mysql> pager cut -c -179
PAGER set to 'cut -c -179'
mysql> select * from db;
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| Host      | Db         | User       | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| %         | test       |            | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| %         | test\_%    |            | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| localhost | phpmyadmin | phpmyadmin | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| localhost | it         | it         | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
4 rows in set (0.00 sec)

mysql>

出力は不完全です。コンテンツは画面に適合します。

2つ目:

.vimrcでvimモードをnowrapに設定します

  ~  tail ~/.vimrc

" no-wrap for myslq cli
set nowrap

mysql> pager vim -
PAGER set to 'vim -'
mysql> select * from db;
    Vim: Reading from stdin...
+-----------+------------+------------+-------------+-------------+----------
| Host      | Db         | User       | Select_priv | Insert_priv | Update_pr
+-----------+------------+------------+-------------+-------------+----------
| %         | test       |            | Y           | Y           | Y
| %         | test\_%    |            | Y           | Y           | Y
| localhost | phpmyadmin | phpmyadmin | Y           | Y           | Y
| localhost | it         | it         | Y           | Y           | Y
+-----------+------------+------------+-------------+-------------+----------
~
~
~

これは、軽量のDockerコンテナで私にとって最も効果的でした。pager cut -c -200。ここで受け入れられる回答が増えると、不要な依存関係をダウンロードする必要が出てきました。
ガブリエルゲイツ

7

私が最もよく考えた答えを補足するために、私も使用しますless -SFXが、別の方法で使用し.my.cnfます。ホームフォルダー内の自分のファイルにそれを広告したい場合、cnfファイルの例は次のようになります。

[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'

このようにすることの良い点lessは、クエリの出力が実際に2ページ以上ある場合にのみ使用されることです。これがすべてのフラグの説明です。

  • -S:単一の行。行が画面より広い場合は行をスキップせず、右にスクロールできるようにします。
  • -F:1つの画面の場合は終了します、コンテンツをスクロールする必要がない場合は、標準出力に送信します。
  • -X:いいえ、初期化せず、ロードするたびに出力するように構成された「少ない」出力を無効にします。

注:.my.cnfファイルでは、pagerコマンドを[client]キーワードの下に記述しないでください。mysqlうまく機能するかもしれませんが、それをmysqldump認識しないと文句を言うでしょう。


大きなテーブルで「制限なし」のクエリを実行した場合less、出力の最初の行にアンカーされたままになるため、クエリによって引き起こされる混乱に気付かないことに注意してください。
サンティアゴアリスティ2017

2

MySQLをインタラクティブに使用している場合は、ポケットベルを次のsedように設定できます。

$ mysql -u <user> p<password>
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah 
.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"

sedページャーとして使用しない場合、出力は次のようになります。

"blah":"blah","blah":"blah","blah":"blah"

1

私が書いたpspg- https://github.com/okbob/pspg

このページャーは表形式のデータ用に設計されており、MySQLもサポートされています。

MariaDB [sakila]>ページャーpspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGERを 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'に設定
MariaDB [sakila]>今すぐ選択();
MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100;

0

パテにはウィンドウに指定できる列の最大数があると思います。

Windowsの場合、私は個人的にWindows PowerShellを使用して、画面バッファーの幅をかなり大きく設定します。列幅は固定されたままなので、水平スクロールバーを使用してデータを表示できます。私はあなたが今抱えているのと同じ問題を抱えていました。

編集:SSHで接続する必要があるリモートホストの場合、plink + Windows PowerShellなどを使用します。



-1

Windowsコマンドプロンプトを使用して、列の数を表示したいだけウィンドウのバッファサイズを増やすことができます。これは、テーブルの列の数に依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.