Come visualizzare al meglio in Terminal un MySQL SELECT che restituisce troppi campi?


271

Sto usando PuTTY per eseguire:

mysql> SELECT * FROM sometable;

sometableha molti campi e questo si traduce in molte colonne che cercano di essere visualizzate nel terminale. I campi si spostano sulla riga successiva, quindi è molto difficile allineare i titoli delle colonne con i valori dei campi.

Quali soluzioni ci sono per visualizzare tali dati nel terminale?

Non ho né voglio accedere a phpMyAdmin o ad altre interfacce della GUI. Sto cercando soluzioni da riga di comando come questa: Salva i risultati delle query MySQL in file di testo o CVS


La soluzione è che lo sviluppatore corregga il bug che impedisce l'espansione del terminale su una schermata più ampia.
Gufo

@ Gufo, è davvero un bug? Le soluzioni fornite qui non hanno ancora risolto il problema?
Gathide,

Risposte:


532

Termina la query con \G al posto di ; . Per esempio:

SELECT * FROM sometable\G

Questa query visualizza le righe in verticale, in questo modo:

*************************** 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
Nonostante Windows non sia sensibile al maiuscolo / minuscolo, questo Gdeve essere in maiuscolo.
Rafael Barros,

3
Solo per chiarire il commento sopra, quando si digita SELECT * FROM sometable\Gsi sta inviando la stringa al client della riga di comando mysql, non a Windows, motivo per cui Gè sensibile al maiuscolo / minuscolo
Uragano Hamilton,

2
Solo che non funziona così bene con grandi quantità di record.
Błażej Michalik,

1
La documentazione collegata dice: "ego (\ G) Invia il comando al server mysql, visualizza il risultato in verticale. Fai attenzione a definire un delimitatore che potrebbe verificarsi in altre parole. Ad esempio, se definisci il delimitatore come X, non sarai in grado di usa la parola INDICE nelle istruzioni. "
Benjamin,

L'ho incontrato. Potresti dirmi come risolverlo? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang,

347

Potresti anche trovare utile (solo non Windows):

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

Questo eseguirà il pipe outout attraverso lo lessstrumento da riga di comando che - con questi parametri - ti darà un output tabulare che può essere fatto scorrere orizzontalmente e verticalmente con i tasti cursore.

Lasciare questa vista premendo il qtasto, che uscirà dallo lessstrumento.


23
questo è geniale. consiglio eccellente. Fin dagli albori del tempo ho voluto questo.
Richard H,

60
può essere resettato usando nopager.
epeleg,

3
La ricerca in less viene eseguita premendo /e quindi scrivendo la stringa di ricerca, che può anche essere regex, quindi premere Invio. Cerca in avanti premendo ne indietro premendo N( Shift + n).
Krøllebølle,

5
lesspuò fare cose ancora più interessanti. Usando &puoi filtrare (mostra solo le linee corrispondenti) il risultato ulteriormente usando espressioni regolari. Funziona in aggiunta alla /ricerca (che causerà comunque l'evidenziazione). Ripristina il filtro premendo di &nuovo e quindi semplicemente premendo Invio.
Daniel Schneller,

3
F si chiuderà meno immediatamente, se l'uscita si adatta già allo schermo. X è per impedire a meno di provare a cancellare lo schermo all'uscita. Vedi la pagina man meno.
Daniel Schneller,

46

Prova ad abilitare la modalità verticale, usando \Gper eseguire la query invece di ;:

mysql> SELECT * FROM sometable \G

I risultati verranno elencati in modalità verticale, quindi ogni valore di colonna verrà stampato su una riga separata. L'output sarà più stretto ma ovviamente molto più lungo.


2
come complemento di \G, puoi anche usare \gcome sostituto di ;, lo so, chi lo farebbe, ma dà contesto al perché \Gworkd in primo luogo.
santiago arizti,

25

Usando mysqlil egocomando di

Da mysql's helpcomando:

ego (\ G) Invia il comando al server mysql, visualizza il risultato in verticale.

Quindi aggiungendo a \Gal tuo select, puoi ottenere un output verticale molto pulito:

mysql> SELECT * FROM sometable \G

Usando un cercapersone

Puoi dire a MySQL di usare il lesscercapersone con la sua -Sopzione che taglia linee larghe e ti dà un output che puoi scorrere con i tasti freccia:

mysql> pager less -S

Pertanto, la prossima volta che esegui un comando con un output ampio, MySQL ti permetterà di sfogliare l'output con il lesscercapersone:

mysql> SELECT * FROM sometable;

Se hai finito con il cercapersone e vuoi tornare al normale output attivo stdout, usa questo:

mysql> nopager

2
Questo! Bello, l'unico modo per renderlo più perfetto è avere un modo per vedere fino a che punto le colonne si estendono orizzontalmente. Come una barra di scorrimento. Tuttavia, ottima soluzione.
Brandon Benefield,

24

È possibile utilizzare l' opzione --tableo -t, che produrrà un insieme di risultati dall'aspetto gradevole

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

o qualche altro metodo per passare una query a mysql, come:

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

produzione:

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

Il cercapersone predefinito è stdout. Lo stdout ha la limitazione della colonna, quindi l'output verrebbe spostato. È possibile impostare altri strumenti come cercapersone per formattare l'output. Esistono due metodi. Uno è limitare la colonna, l'altro è elaborarlo in VIM.

Il primo metodo:

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

L'output non è completo. Il contenuto si adatta al tuo schermo.

Il secondo:

Imposta la modalità vim su nowrap nel tuo .vimrc

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

Questo ha funzionato meglio per me in un contenitore docker leggero. pager cut -c -200. Le risposte più accettate qui mi hanno richiesto di scaricare dipendenze non necessarie.
Gabriel Gates,

7

Solo per completare la risposta che ho pensato meglio, uso anche less -SFXma in modo diverso: mi piace pubblicizzarlo sul mio .my.cnffile nella mia cartella home, un esempio di file cnf è simile al seguente:

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

La cosa buona di averlo fatto in questo modo è che lessviene utilizzato solo quando l'output di una query è in realtà più di una pagina, ecco la spiegazione di tutti i flag:

  • -S: linea singola, non saltare la linea quando la linea è più larga dello schermo, invece consente di scorrere verso destra.
  • -F: Esci da una schermata , se il contenuto non ha bisogno di scorrere, quindi invia a stdout.
  • -X: No init, disabilita qualsiasi output "less" potrebbe essere configurato per l'output ogni volta che viene caricato.

Nota: nel .my.cnffile non inserire il pagercomando sotto la [client]parola chiave; anche se potrebbe funzionare mysqlbene, mysqldumpsi lamenterà di non riconoscerlo.


Notare che se si esegue una query "senza limiti" su una tabella di grandi dimensioni, non si noterà il caos causato da essa poiché lessrimarrà ancorato alla prima riga dell'output.
santiago arizti,

2

Se si utilizza MySQL in modo interattivo, è possibile impostare il pager in modo che utilizzi in sedquesto modo:

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

Se non si utilizza sedcome cercapersone, l'output è così:

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

1

Ho scritto pspg- https://github.com/okbob/pspg

Questo cercapersone è progettato per dati tabulari e anche MySQL è supportato.

MariaDB [sakila]> cercapersone pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER impostato su 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'
MariaDB [sakila]> seleziona ora ();
MariaDB [sakila]> seleziona * da limite nicer_but_slower_film_list 100;

0

Credo che lo stucco abbia un numero massimo di colonne che puoi specificare per la finestra.

Per Windows uso personalmente Windows PowerShell e imposto una larghezza del buffer dello schermo ragionevolmente alta. La larghezza della colonna rimane fissa ed è possibile utilizzare una barra di scorrimento orizzontale per visualizzare i dati. Ho avuto lo stesso problema che stai riscontrando ora.

modifica: per gli host remoti in cui devi SSH utilizzeresti qualcosa come plink + Windows PowerShell


0

È possibile utilizzare teeper scrivere il risultato della query in un file:

tee somepath\filename.txt

-1

Utilizzando il Prompt dei comandi di Windows è possibile aumentare la dimensione del buffer della finestra tanto quanto si desidera vedere il numero di colonne. Questo dipende dal numero di colonne nella tabella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.