Jak najlepiej wyświetlić w terminalu MySQL SELECT zwracając zbyt wiele pól?

271

Używam PuTTY do uruchamiania:

mysql> SELECT * FROM sometable;

sometablema wiele pól, co powoduje, że wiele kolumn próbuje wyświetlić się w terminalu. Pola zawijają się do następnego wiersza, więc bardzo trudno jest wyrównać tytuły kolumn z wartościami pól.

Jakie są rozwiązania do przeglądania takich danych w terminalu?

Nie mam ani nie chcę dostępu do phpMyAdmin - ani żadnych innych interfejsów GUI. Szukam rozwiązań wiersza polecenia, takich jak to: Zapisz wyniki zapytania MySQL w pliku tekstowym lub CVS

Chris Jacob
źródło
Rozwiązaniem jest, aby programista naprawił błąd, który uniemożliwia rozszerzenie terminala do szerszego niż jednego ekranu.
Sowa
@Owl, czy to naprawdę błąd? Czy przedstawione tutaj rozwiązania nie rozwiązały jeszcze problemu?
Gathide

Odpowiedzi:

531

Zakończ zapytanie za pomocą \G zamiast ; . Na przykład:

SELECT * FROM sometable\G

To zapytanie wyświetla wiersze w pionie, jak poniżej:

*************************** 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
          ...
Rytmis
źródło
9
Pomimo tego, że Windows nie rozróżnia wielkości liter, Gmusi to być wielkie litery.
Rafael Barros
3
Aby wyjaśnić powyższy komentarz, podczas pisania SELECT * FROM sometable\Gwysyłasz ciąg do klienta wiersza poleceń mysql, a nie systemu Windows, dlatego Grozróżniana jest wielkość liter
Hurricane Hamilton
2
Tyle że nie działa tak dobrze z dużą ilością rekordów.
Błażej Michalik
1
Powiązana dokumentacja mówi: „ego (\ G) Wyślij polecenie na serwer mysql, wyświetl wynik pionowo. Uważaj na zdefiniowanie separatora, który może występować w innych słowach. Na przykład, jeśli zdefiniujesz separator jako X, nie będziesz w stanie użyj słowa INDEKS w instrukcjach. ”
Benjamin,
Spotkałem to. Czy możesz mi powiedzieć, jak to naprawić? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang
347

Może się to również przydać (tylko inne niż Windows):

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

Spowoduje to przepuszczenie outut przez lessnarzędzie wiersza poleceń, które - przy tych parametrach - da ci tabelaryczne dane wyjściowe, które można przewijać poziomo i pionowo za pomocą klawiszy kursora.

Opuść ten widok, naciskając qklawisz, który zamknie lessnarzędzie.

Daniel Schneller
źródło
23
to jest genialne. doskonała wskazówka. Od zarania czasu tego chciałem.
Richard H
60
można zresetować za pomocą nopager.
epeleg
3
Wyszukiwanie w mniej odbywa się poprzez naciśnięcie, /a następnie napisanie szukanego ciągu, który może być również wyrażeniem regularnym, a następnie naciśnięcie enter. Wyszukaj do przodu, naciskając ni do tyłu, naciskając N( Shift + n).
Krøllebølle
5
lessmoże robić jeszcze więcej fajnych rzeczy. Za pomocą &możesz filtrować (wyświetlać tylko pasujące linie) wynik dalej za pomocą wyrażeń regularnych. Działa to oprócz /wyszukiwania (które nadal spowoduje podświetlenie). Zresetuj filtr, naciskając &ponownie, a następnie naciskając klawisz Return.
Daniel Schneller
3
F wyjdzie mniej natychmiast, jeśli wyjście już pasuje do ekranu. X ma zapobiegać próbom wyczyszczenia ekranu przy wyjściu przez mniej. Zobacz stronę man mniej.
Daniel Schneller,
46

Spróbuj włączyć tryb pionowy, używając \Gdo wykonania zapytania zamiast ;:

mysql> SELECT * FROM sometable \G

Wyniki zostaną wyświetlone w trybie pionowym, więc każda wartość kolumny zostanie wydrukowana w osobnym wierszu. Wydajność będzie węższa, ale oczywiście znacznie dłuższa.

Świety
źródło
2
jako uzupełnienie \G, możesz również użyć \gjako zamiennik ;, wiem, kto by to zrobił, ale daje kontekst, dlaczego \Gw ogóle pracował.
santiago arizti
25

Korzystanie mysql„s egopolecenie

Z mysql„s helppolecenia:

ego (\ G) Wyślij polecenie na serwer mysql, wyświetl wynik pionowo.

Dołączając a \Gdo swojego select, możesz uzyskać bardzo czysty pionowy wynik:

mysql> SELECT * FROM sometable \G

Korzystanie z pagera

Możesz powiedzieć MySQL, aby używał lesspagera z -Sopcją, która tnie szerokie linie i daje wynik, który możesz przewijać za pomocą klawiszy strzałek:

mysql> pager less -S

Zatem następnym razem, gdy uruchomisz polecenie z szerokim wyjściem, MySQL pozwoli ci przeglądać dane wyjściowe za pomocą lesspagera:

mysql> SELECT * FROM sometable;

Jeśli skończyłeś z pageriem i chcesz wrócić do zwykłego wyjścia stdout, użyj tego:

mysql> nopager
Ronan Boiteau
źródło
2
To! Piękny, jedyny sposób, aby uczynić to doskonalszym, to mieć sposób, aby zobaczyć, jak daleko kolumny rozciągają się w poziomie. Jak pasek przewijania. Niemniej jednak świetne rozwiązanie.
Brandon Benefield
24

Możesz użyć opcji --tablelub -t, która wygeneruje ładnie wyglądający zestaw wyników

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

lub inna metoda przekazania zapytania do mysql, na przykład:

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

wynik:

+--------------+--------------+------+-----+---------+----------------+
| 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    |                |
+--------------+--------------+------+-----+---------+----------------+
davidmh
źródło
8

Domyślny pager to standardowe wyjście. Stdout ma ograniczenie kolumny, więc wyjście zostanie zawinięte. Możesz ustawić inne narzędzia jako pager do formatowania danych wyjściowych. Istnieją dwie metody. Jednym z nich jest ograniczenie kolumny, drugim jest przetworzenie jej w vimie.

Pierwsza metoda:

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

Dane wyjściowe nie są kompletne. Treść pasuje do twojego ekranu.

Drugie:

Ustaw tryb vim na nowrap w swoim .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
+-----------+------------+------------+-------------+-------------+----------
~
~
~
hyang0
źródło
To działało mi najlepiej w lekkim pojemniku dokującym. pager cut -c -200. Bardziej akceptowane odpowiedzi wymagały ode mnie pobrania niepotrzebnych zależności.
Gabriel Gates
7

Aby uzupełnić odpowiedź, którą uważałem za najlepszą, używam również, less -SFXale w inny sposób: lubię reklamować go w moim .my.cnfpliku w folderze domowym, przykładowy plik cnf wygląda następująco:

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

Zaletą posiadania tego w ten sposób jest to, że lessjest używane tylko wtedy, gdy wynik zapytania jest w rzeczywistości dłuższy niż jedna strona, oto wyjaśnienie wszystkich flag:

  • -S: Pojedyncza linia, nie pomijaj linii, gdy linia jest szersza niż ekran, zamiast tego pozwól na przewijanie w prawo.
  • -F: Wyjdź, jeśli jeden ekran , jeśli zawartość nie wymaga przewijania, po prostu wyślij na standardowe wyjście.
  • -X: Brak init, wyłącza jakiekolwiek wyjście „mniej”, które mogło zostać skonfigurowane do wyjścia za każdym razem, gdy się ładuje.

Uwaga: w .my.cnfpliku nie umieszczaj pagerpolecenia pod [client]słowem kluczowym; chociaż może mysqldobrze działać , mysqldumpbędzie narzekać na nieuznawanie go.

santiago arizti
źródło
Zauważ, że jeśli wykonasz zapytanie „bez ograniczeń” na dużej tabeli, nie zauważysz wywołanego przez nią chaosu, ponieważ lesspozostanie zakotwiczony w pierwszym wierszu wyniku.
Santiago arizti
2

Jeśli korzystasz z MySQL interaktywnie, możesz ustawić swój pager w sedtaki sposób:

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

Jeśli nie używasz go sedjako pager, wynik wygląda następująco:

"blah":"blah","blah":"blah","blah":"blah"
Paul Ericson
źródło
1

Napisałem pspg- https://github.com/okbob/pspg

Ten pager jest przeznaczony do danych tabelarycznych - obsługiwany jest także MySQL.

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder - quit-if-one-screen
PAGER ustawiony na „pspg -s 14 -X --force-uniborder - quit-if-one-screen”
MariaDB [sakila]> wybierz teraz ();
MariaDB [sakila]> wybierz * z nicer_but_slower_film_list limit 100;
Pavel Stehule
źródło
0

Wierzę, że kit ma maksymalną liczbę kolumn, które można określić dla okna.

W systemie Windows osobiście korzystam z programu Windows PowerShell i ustawiam szerokość bufora ekranu na dość wysoką. Szerokość kolumny pozostaje stała i można użyć poziomego paska przewijania, aby wyświetlić dane. Miałem ten sam problem, co teraz.

edycja: W przypadku hostów zdalnych, do których musisz włączyć SSH, użyj czegoś takiego jak plink + Windows PowerShell

Patrick Gryciuk
źródło
0

Możesz użyć teedo zapisania wyniku zapytania do pliku:

tee somepath\filename.txt
Sathishkumar
źródło
-1

Za pomocą wiersza polecenia systemu Windows można zwiększyć rozmiar bufora okna tak, aby zobaczyć liczbę kolumn. Zależy to od liczby kolumn w tabeli.

Sathishkumar
źródło