Як найкраще відобразити MySQL SELECT у терміналі, повертаючи занадто багато полів?


271

Я використовую PuTTY для запуску:

mysql> SELECT * FROM sometable;

sometableмає багато полів, і це призводить до багатьох стовпців, які намагаються відображатися в терміналі. Поля загортаються на наступний рядок, тому дуже складно вирівняти заголовки стовпців зі значеннями поля.

Які рішення існують для перегляду таких даних у терміналі?

У мене немає ні хочу доступу до phpMyAdmin - або будь-якого іншого інтерфейсу GUI. Я шукаю такі рішення в командному рядку, як це: Збережіть результати MySQL Query у текст чи файл CVS


Рішення полягає в тому, щоб розробник виправляв помилку, яка зупиняє розширення терміналу на ширший, ніж на одному екрані.
Сова

@Owl, це справді помилка? Чи запропоновані тут рішення ще не вирішили проблему?
Gathide

Відповіді:


531

Завершіть запит \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потрібно використовувати з великої літери.
Рафаель Баррос

3
Просто для уточнення вищезазначеного коментаря, коли ви вводите, SELECT * FROM sometable\Gви надсилаєте рядок клієнтові командного рядка mysql, а не Windows, саме тому в Gрегістрі
Ураган Гамільтон,

2
За винятком того, що це не дуже добре працює з великою кількістю записів.
Błażej Michalik

1
Пов'язана документація говорить: "ego (\ G) Надіслати команду серверу mysql, відобразити результат вертикально. Будьте уважні до визначення роздільника, який може виникнути в інших словах. Наприклад, якщо ви визначите роздільник як X, ви не зможете використовувати слово INDEX у висловлюваннях. "
Бенджамін

Я стикався з цим. Скажіть, будь ласка, як це виправити? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang

347

Можливо, ви також знайдете це корисне (лише для ОС Windows):

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

Це передасть вихід через інструмент lessкомандного рядка, який - з цими параметрами - дасть вам табличний вихід, який можна прокручувати по горизонталі та вертикалі клавішами курсору.

Залиште цей погляд, натиснувши qклавішу, яка закриє lessінструмент.


23
це геній. відмінна порада. Ще з світанку часу я цього хотів.
Річард Н

60
можна скинути за допомогою nopager.
epeleg

3
Пошук менше проводиться натисканням, /а потім записом рядка пошуку, який також може бути зворотним виразом, а потім натисніть клавішу Enter. Шукайте вперед, натискаючи nта назад, натискаючи N( Shift + n).
Krøllebølle

5
lessможе робити ще більш круті речі. За допомогою &ви можете фільтрувати (показувати лише відповідні рядки) результат додатково, використовуючи регулярні вирази. Це працює на додаток до /пошуку (що все ще спричинить виділення). Скиньте фільтр, натиснувши &знову, а потім просто натиснувши кнопку Return.
Даніель Шнеллер

3
F негайно вийде, якщо вихід вже відповідає екрану. X - запобігти меншим спробам очищення екрана при виході. Дивіться сторінку меншої кількості чоловіків.
Даніель Шнеллер

46

Спробуйте ввімкнути вертикальний режим, використовуючи \Gдля виконання запиту замість ;:

mysql> SELECT * FROM sometable \G

Результати відображатимуться у вертикальному режимі, тому кожне значення стовпця буде надруковано в окремому рядку. Вихід буде вужчим, але, очевидно, набагато довшим.


2
як доповнення до \G, ви також можете використовувати \gяк заміну ;, я знаю, хто це зробив би, але це дає контекст тому, чому \Gпрацювали в першу чергу.
santiago arizti

25

Використання mysql«S egoкоманди

З команди mysql's help:

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
Це! Прекрасний, єдиний спосіб зробити це більш досконалим - це мати спосіб бачити, наскільки колони тягнуться по горизонталі. Як смуга прокрутки. Тим не менш, чудове рішення.
Брендон Бенефілд

24

Ви можете скористатися параметром --tableабо -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 є обмеження стовпця, тому вихід буде завершений. Ви можете встановити інші інструменти як пейджер для форматування результатів. Існує два методи. Одне - обмежити стовпець, інше - обробити його in 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>

Вихід не завершений. Вміст підходить до вашого екрану.

Другий:

Встановіть режим vim, щоб тепер увімкнути ваш .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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

Для мене це найкраще працювало в легкій докерній тарі. pager cut -c -200. Більш прийняті відповіді тут вимагали від мене завантаження зайвих залежностей.
Габріель Гейтс

7

Просто для доповнення відповіді, яку я вважав найкращим, я також використовую, less -SFXале по-іншому: я люблю .my.cnfрозміщувати його у своєму файлі у своїй домашній папці, наприклад, файл cnf виглядає так:

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

Хороша річ у тому, щоб це було таким чином, це те, що lessвін використовується лише тоді, коли вихід запиту насправді довший однієї сторінки, ось пояснення всіх прапорів:

  • -S: Однорядковий, не пропускайте лінію, коли рядок ширший за екран, натомість дозволяйте прокручувати праворуч.
  • -F: Закрийте, якщо на одному екрані , якщо вміст не потрібно прокручувати, тоді просто надсилайте до stdout.
  • -X: Немає init, відключає будь-який вихід "менше", можливо, налаштовувався на виведення кожного разу, коли він завантажується.

Примітка: у .my.cnfфайлі не ставлять pagerкоманду під [client]ключовим словом; хоча це може працювати mysqlдобре, mysqldumpскаржиться на те, що його не визнають.


Зауважте, що якщо ви виконаєте запит "без обмежень" на великій таблиці, ви не помітите хаос, спричинений ним, оскільки lessзалишиться прив’язаним до першого рядка виводу.
santiago arizti

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]> вибрати * від nicer_but_slower_film_list межа 100;

0

Я вважаю, що шпаклівка має максимальну кількість стовпців, які ви можете вказати для вікна.

Для Windows я особисто використовую Windows PowerShell і встановлюю ширину буфера екрана досить високою. Ширина стовпця залишається фіксованою, і ви можете використовувати горизонтальну смугу прокрутки, щоб переглянути дані. У мене була та сама проблема, яку ви маєте зараз.

редагувати: Для віддалених хостів, які вам належать SSH, ви б використовували щось на кшталт plink + Windows PowerShell



-1

Використовуючи командний рядок Windows, ви можете збільшити розмір буфера вікна на стільки, скільки ви хочете побачити кількість стовпців. Це залежить від кількості стовпців у таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.