Wie kann man im Terminal am besten ein MySQL SELECT anzeigen, das zu viele Felder zurückgibt?


271

Ich verwende PuTTY , um Folgendes auszuführen:

mysql> SELECT * FROM sometable;

sometablehat viele Felder und dies führt dazu, dass viele Spalten versuchen, im Terminal angezeigt zu werden. Die Felder werden in die nächste Zeile umgebrochen, sodass es sehr schwierig ist, Spaltentitel mit Feldwerten auszurichten.

Welche Lösungen gibt es, um solche Daten im Terminal anzuzeigen?

Ich habe und möchte keinen Zugriff auf phpMyAdmin - oder andere GUI-Schnittstellen. Ich suche nach Befehlszeilenlösungen wie dieser: Speichern Sie die Ergebnisse der MySQL-Abfrage in Text- oder CVS-Dateien


Die Lösung besteht darin, dass der Entwickler den Fehler behebt, der verhindert, dass das Terminal auf einen Bildschirm erweitert wird.
Eule

@Owl, ist das wirklich ein Fehler? Haben die hier angebotenen Lösungen das Problem noch nicht gelöst?
Gathide

Antworten:


531

Beenden Sie die Abfrage mit \G anstelle von ; . Zum Beispiel:

SELECT * FROM sometable\G

Diese Abfrage zeigt die Zeilen vertikal wie folgt an:

*************************** 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
Obwohl Windows nicht zwischen Groß- und Kleinschreibung unterscheidet, Gmuss dies aktiviert werden.
Rafael Barros

3
Um den obigen Kommentar zu verdeutlichen, SELECT * FROM sometable\Gsenden Sie bei der Eingabe die Zeichenfolge an den MySQL-Befehlszeilenclient und nicht an Windows. Aus diesem Grund Gwird zwischen Groß- und Kleinschreibung unterschieden
Hurricane Hamilton,

2
Nur dass es bei großen Mengen an Datensätzen nicht so gut funktioniert.
Błażej Michalik

1
In der verknüpften Dokumentation heißt es: "ego (\ G) Befehl an MySQL-Server senden, Ergebnis vertikal anzeigen. Achten Sie darauf, ein Trennzeichen zu definieren, das mit anderen Worten auftreten kann. Wenn Sie beispielsweise das Trennzeichen als X definieren, können Sie dies nicht." Verwenden Sie das Wort INDEX in Anweisungen. "
Benjamin

Ich bin darauf gestoßen. Könnten Sie mir bitte sagen, wie ich das Problem beheben kann? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang

346

Möglicherweise finden Sie dies auch nützlich (nur unter Windows):

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

Dadurch wird das Ergebnis durch das lessBefehlszeilen-Tool geleitet, das mit diesen Parametern eine tabellarische Ausgabe liefert, die mit den Cursortasten horizontal und vertikal gescrollt werden kann.

Verlassen Sie diese Ansicht, indem Sie die qTaste drücken, wodurch das lessTool beendet wird.


23
Das ist Genie. ausgezeichneter Tipp. Seit Anbeginn der Zeit habe ich das gewollt.
Richard H

60
kann mit nopager zurückgesetzt werden.
Epeleg

3
Das Suchen in weniger erfolgt durch Drücken /und Schreiben der Suchzeichenfolge, die auch Regexe sein kann, und Drücken der Eingabetaste. Suchen Sie vorwärts durch Drücken von nund rückwärts durch Drücken von N( Shift + n).
Krøllebølle

5
lesskann noch mehr coole Dinge tun. Mit können &Sie das Ergebnis mithilfe regulärer Ausdrücke weiter filtern (nur übereinstimmende Linien anzeigen). Dies funktioniert zusätzlich zur /Suche (die weiterhin die Hervorhebung verursacht). Setzen Sie den Filter zurück, indem Sie &erneut drücken und dann einfach die Eingabetaste drücken.
Daniel Schneller

3
F wird weniger sofort beendet, wenn die Ausgabe bereits auf den Bildschirm passt. X soll verhindern, dass weniger versucht, den Bildschirm beim Beenden zu löschen. Siehe die weniger Manpage.
Daniel Schneller

46

Versuchen Sie, den vertikalen Modus zu aktivieren, indem Sie \Gdie Abfrage ausführen, anstatt ;:

mysql> SELECT * FROM sometable \G

Ihre Ergebnisse werden im vertikalen Modus aufgelistet, sodass jeder Spaltenwert in einer separaten Zeile gedruckt wird. Die Ausgabe wird schmaler, aber offensichtlich viel länger.


2
Als Ergänzung dazu \Gkönnen Sie , wie ich weiß, auch \gals Ersatz dafür dienen ;, wer das tun würde, aber es gibt einen Kontext dafür, warum \Güberhaupt gearbeitet wurde.
Santiago Aristi

25

Mit mysqldem egoBefehl von

Von mysql's helpBefehl:

ego (\ G) Befehl an MySQL-Server senden, Ergebnis vertikal anzeigen.

Wenn Sie also ein \Gan Ihr anhängen select, erhalten Sie eine sehr saubere vertikale Ausgabe:

mysql> SELECT * FROM sometable \G

Verwenden eines Pagers

Sie können MySQL anweisen, den lessPager mit seiner -SOption zu verwenden, die breite Linien schneidet und Ihnen eine Ausgabe gibt, die Sie mit den Pfeiltasten scrollen können:

mysql> pager less -S

Wenn Sie also das nächste Mal einen Befehl mit einer breiten Ausgabe ausführen, können Sie mit MySQL die Ausgabe mit dem lessPager durchsuchen :

mysql> SELECT * FROM sometable;

Wenn Sie mit dem Pager fertig sind und zur regulären Ausgabe zurückkehren möchten stdout, verwenden Sie Folgendes:

mysql> nopager

2
Dies! Schön, nur um dies zu perfektionieren, müssen Sie sehen, wie weit sich die Säulen horizontal erstrecken. Wie eine Bildlaufleiste. Trotzdem tolle Lösung.
Brandon Benefield

24

Sie können die Option --tableoder verwenden -t, die eine gut aussehende Reihe von Ergebnissen ausgibt

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

oder eine andere Methode, um eine Abfrage an MySQL zu übergeben, wie:

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

Ausgabe:

+--------------+--------------+------+-----+---------+----------------+
| 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

Der Standard-Pager ist stdout. Das stdout hat die Spaltenbeschränkung, sodass die Ausgabe umbrochen wird. Sie können andere Tools als Pager festlegen, um die Ausgabe zu formatieren. Es gibt zwei Methoden. Eine besteht darin, die Spalte zu begrenzen, die andere darin, sie in vim zu verarbeiten.

Die erste Methode:

  ~  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>

Die Ausgabe ist nicht vollständig. Der Inhalt passt zu Ihrem Bildschirm.

Der zweite:

Stellen Sie den vim-Modus so ein, dass er jetzt in Ihrer .vimrc-Datei angezeigt wird

  ~  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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

Dies funktionierte am besten für mich in einem leichten Docker-Container. pager cut -c -200. Für die hier akzeptierten Antworten musste ich unnötige Abhängigkeiten herunterladen.
Gabriel Gates

7

Um die Antwort zu ergänzen, die ich für am besten hielt, verwende ich sie auch, less -SFXaber auf eine andere Art und Weise: Ich möchte sie meiner .my.cnfDatei in meinem Home-Ordner hinzufügen. Eine Beispiel-CNF-Datei sieht folgendermaßen aus:

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

Das Gute daran ist, dass lesses nur verwendet wird, wenn die Ausgabe einer Abfrage tatsächlich mehr als eine Seite lang ist. Hier ist die Erklärung aller Flags:

  • -S: Einzelne Zeile, überspringen Sie keine Zeile, wenn die Zeile breiter als der Bildschirm ist, sondern lassen Sie stattdessen nach rechts scrollen.
  • -F: Beenden Sie, wenn ein Bildschirm angezeigt wird und der Inhalt nicht gescrollt werden muss, und senden Sie ihn einfach an stdout.
  • -X: Kein Init, deaktiviert eine Ausgabe, die "weniger" möglicherweise so konfiguriert hat, dass sie bei jedem Laden ausgegeben wird.

Hinweis: .my.cnfSetzen Sie den pagerBefehl in der Datei nicht unter das [client]Schlüsselwort. Obwohl es gut funktionieren könnte mysql, mysqldumpwird sich darüber beschweren, dass es nicht erkannt wird.


Beachten Sie, dass Sie beim Ausführen einer Abfrage ohne Limit für eine große Tabelle das dadurch verursachte Chaos nicht bemerken, da lesses in der ersten Zeile der Ausgabe verankert bleibt.
Santiago Aristi

2

Wenn Sie MySQL interaktiv verwenden, können Sie Ihren Pager sedwie folgt einstellen :

$ 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"

Wenn Sie nicht sedals Pager verwenden, sieht die Ausgabe folgendermaßen aus:

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

1

Ich schrieb pspg- https://github.com/okbob/pspg

Dieser Pager wurde für tabellarische Daten entwickelt - und MySQL wird ebenfalls unterstützt.

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER auf 'pspg -s 14 -X --force-uniborder --quit-if-one-screen' gesetzt
MariaDB [sakila]> jetzt auswählen ();
MariaDB [sakila]> wähle * aus nicer_but_slower_film_list limit 100;

0

Ich glaube, Kitt hat eine maximale Anzahl von Spalten, die Sie für das Fenster angeben können.

Für Windows verwende ich persönlich Windows PowerShell und stelle die Bildschirmpufferbreite einigermaßen hoch ein. Die Spaltenbreite bleibt fest und Sie können eine horizontale Bildlaufleiste verwenden, um die Daten anzuzeigen. Ich hatte das gleiche Problem, das Sie jetzt haben.

Bearbeiten: Für Remote-Hosts, in die Sie SSH einbinden müssen, verwenden Sie beispielsweise plink + Windows PowerShell


0

Sie können teedas Ergebnis Ihrer Abfrage in eine Datei schreiben:

tee somepath\filename.txt

-1

Mit der Windows-Eingabeaufforderung können Sie die Puffergröße des Fensters so weit erhöhen, wie Sie die Anzahl der Spalten anzeigen möchten. Dies hängt von der Anzahl der Spalten in der Tabelle ab.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.